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
If an interface uses
size_t, the smallest header that suffices is
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
For example, a
<standard-c.h> could be devised that includes all the
standard C headers — with care since some headers are not always
However, very few programs actually use the facilities of