Headers are a crucial consistency checking mechanism, but they should be as small as possible. In particular, that means that a header should not include other headers just because the implementation file will need the other headers. A header should contain only those headers necessary for a consumer of the services described.
For example, a project header should not include
<stdio.h> unless one of the function interfaces uses the type
FILE * (or one of the other types defined solely in
<stdio.h>). If an interface uses
size_t, the smallest header that suffices is
<stddef.h>. Obviously, if another header that defines
size_t is included, there is no need to include
If the headers are minimal, then it keeps the compilation time to a minimum too.
It is possible to devise headers whose sole purpose is to include a lot of other headers. These seldom turn out to be a good idea in the long run because few source files will actually need all the facilities described by all the headers. For example, a
<standard-c.h> could be devised that includes all the standard C headers — with care since some headers are not always present. However, very few programs actually use the facilities of