Якщо є певний заголовок, який, на вашу думку, більше не потрібен (скажімо, string.h), ви можете прокоментувати, що включати, а потім поставити це нижче всіх включених:
#ifdef _STRING_H_
# error string.h is included indirectly
#endif
Звичайно, ваші заголовки інтерфейсу можуть використовувати іншу конвенцію #define для запису їх включення до пам'яті CPP. Або жодної конвенції, і в цьому випадку такий підхід не спрацює.
Потім перебудуйте. Є три можливості:
Це будує нормально string.h не був критичним для компіляції, і включення для нього можна видалити.
Помилка # помилки. string.g було якось опосередковано включено. Ви все ще не знаєте, чи потрібно string.h. Якщо це потрібно, вам слід безпосередньо # включити (див. Нижче).
Ви отримуєте іншу помилку компіляції. string.h був потрібний і не включається опосередковано, тому включення було правильним для початку.
Зауважте, що залежно від непрямого включення, коли ваш .h або .c безпосередньо використовує інший .h - це майже напевно помилка: ви фактично обіцяєте, що ваш код вимагатиме цього заголовка лише до тих пір, поки це вимагатиме якийсь інший заголовок, який ви використовуєте, що, мабуть, не те, що ви мали на увазі.
Застереження, згадані в інших відповідях щодо заголовків, які змінюють поведінку, а не те, що декларування речей, які спричиняють помилки збірки, застосовуються і тут.