W niektórych środowiskach kompilacja będzie najszybsza, jeśli zawiera się tylko potrzebne pliki nagłówkowe. W innych środowiskach kompilacja zostanie zoptymalizowana, jeśli wszystkie pliki źródłowe mogą używać tej samej podstawowej kolekcji nagłówków (niektóre pliki mogą mieć dodatkowe nagłówki poza wspólnym podzbiorem). Idealnie, nagłówki powinny być skonstruowane tak, aby wiele operacji #include nie miało żadnego efektu. Dobrze może być otoczenie instrukcji #include sprawdzeniami ochrony włączania pliku, który ma być dołączony, chociaż tworzy to zależność od formatu tej ochrony. Ponadto, w zależności od zachowania systemu w buforowaniu plików, niepotrzebne #include, którego cel zostanie całkowicie # ifdef'ed usunięte, może nie zająć dużo czasu.
Inną rzeczą do rozważenia jest to, że jeśli funkcja przyjmuje wskaźnik do struktury, można zapisać prototyp jako
void foo (struct BAR_s * bar);
bez definicji BAR_s, które muszą znajdować się w zakresie. Bardzo przydatne podejście do unikania niepotrzebnych dołączeń.
PS - w wielu moich projektach będzie plik, którego oczekuje się, że każdy moduł będzie #include, zawierający takie rzeczy jak typedef dla rozmiarów całkowitych oraz kilka typowych struktur i unii [np.
typedef union {
unsigned long l;
unsigned short lw [2];
unsigned char lb [4];
} U_QUAD;
(Tak, wiem, że miałbym kłopoty, gdybym przeniósł się na architekturę big-endian, ale ponieważ mój kompilator nie zezwala na anonimowe struktury w uniach, używanie nazwanych identyfikatorów dla bajtów w unii wymagałoby dostępu do nich jako theUnion.b.b1 itp., co wydaje się dość denerwujące.