У деяких середовищах компіляція буде найшвидшою, якщо в неї входять лише файли заголовків, які потрібні. В інших середовищах компіляція буде оптимізована, якщо всі вихідні файли можуть використовувати одну і ту ж первинну колекцію заголовків (деякі файли можуть мати додаткові заголовки поза загальним підмножиною). В ідеалі заголовки повинні бути побудовані таким чином, що кілька операцій #include не матимуть ефекту. Може бути добре оточити #include операторами перевірок на наявність файлу, який буде включений, включати-охороняти, хоча це створює залежність від формату цього захисту. Крім того, залежно від поведінки кешування файлів системи, зайве #include, ціль якого закінчується повністю # ifdef'ed, може не зайняти багато часу.
Інша річ, яку слід врахувати, це те, що якщо функція бере покажчик на структуру, прототип можна записати як
void foo (struct BAR_s * bar);
без визначення BAR_s, які повинні бути в області застосування. Дуже зручний підхід до уникнення зайвого включає.
PS - у багатьох моїх проектах буде файл, який, як очікується, кожен модуль буде #include, містить такі речі, як typedefs для цілих розмірів та кілька загальних структур та об'єднань [наприклад
typedef union {
ненаписаний довгий l;
ненаписаний короткий lw [2];
непідписаний лідер [4];
} U_QUAD;
(Так, я знаю, що у мене виникнуть проблеми, якщо я перейшов до архітектури великого ендіану, але оскільки мій компілятор не дозволяє анонімним структурам в союзах, використання ідентифікованих ідентифікаторів для байтів у союзі вимагатиме доступу до них як theUnion.b.b1 тощо, що здається досить прикро.