Если есть определенный заголовок, который, по вашему мнению, больше не нужен (например, string.h), вы можете закомментировать его, а затем поместить его под всеми включениями:
#ifdef _STRING_H_
# error string.h is included indirectly
#endif
Конечно, заголовки вашего интерфейса могут использовать другое соглашение #define для записи их включения в память CPP. Или без соглашения, и в этом случае этот подход не сработает.
Затем восстановите. Есть три возможности:
Строится нормально. string.h не критичен для компиляции, и включение для него можно удалить.
Ошибка #error. string.g каким-то образом был включен косвенно. Вы все еще не знаете, требуется ли string.h. Если это необходимо, вы должны напрямую #include (см. Ниже).
У вас другая ошибка компиляции. string.h был необходим и не включается косвенно, поэтому включение было правильным с самого начала.
Обратите внимание, что в зависимости от косвенного включения, когда ваш .h или .c напрямую использует другой .h, почти наверняка это ошибка: вы фактически обещаете, что ваш код будет требовать только этот заголовок, если этого требует какой-то другой заголовок, который вы используете, что, вероятно, не то, что вы имели в виду.
Предостережения, упомянутые в других ответах о заголовках, которые изменяют поведение, а не объявляют вещи, вызывающие сбои сборки, также применяются здесь.