> Simple rule: include files should never include include files. If instead they state (in comments or implicitly) what files they need to have included first, the problem of deciding which files to include is pushed to the user (programmer) but in a way that's easy to handle and that, by construction, avoids multiple inclusions. Multiple inclusions are a bane of systems programming. It's not rare to have files included five or more times to compile a single C source file. The Unix /usr/include/sys stuff is terrible this way.
Plan 9 compilation is very fast. It is small but also it restricts recursive #include, no guards (example [2]), each header has corresponding library, headers included in C file only [1]:
#include <u.h>
#include <libc.h>
void
main(void)
{
...
Remember Go language demo compilation time? Same authors.[0] http://www.lysator.liu.se/c/pikestyle.html
[1] https://www.lysator.liu.se/c/plan9c.html
[2] https://github.com/brho/plan9/blob/master/sys/include/bio.h