title: What are the disadvantages to the use of "umbrella" headers in C projects?
body: <p>I saw an interesting pattern in a C project: they used an umbrella header (a header that includes everything from a component) everywhere, inside the component itself too. </p>
  
  <p>umbrella.h:</p>
  
  <pre><code>#include "component_file1.h"
  #include "component_file2.h"
  /* #include each and every header of the component */ 
  </code></pre>
  
  <p>component_file1.h:</p>
  
  <pre><code>#include "umbrella.h"
  /*include guard and header*/
  </code></pre>
  
  <p>component_file1.c:</p>
  
  <pre><code>#include "umbrella.h"
  /*c code*/
  </code></pre>
  
  <p>The pattern was the same in the other files. The explanation I got was:</p>
  
  <ol>
  <li>Compilation time did not matter in that project</li>
  <li>It was easy to use (no need to know header hierarchy)</li>
  </ol>
  
  <p>An additional technical detail: In umbrella.h they sorted the include directives to solve internal dependencies (for e.g. if component_file_2.h used component_file_1.h their order was: component_file_1.h first then component_file_2.h later) </p>
  
  <p>Aside from compilation time, are there any serious drawbacks to this approach that would counter-indicate its use? On what criteria could a refactor of code that used this approach be justified?</p>