Вы иллюстрируете, почему включение заголовков - отстой в качестве метода импорта пространств имен.
Единственное решение, которое я вижу, - это дисциплина.Стандартные функции библиотеки требуют, чтобы вы включили соответствующий заголовок, ваши проекты должны принять тот же стандарт.Заголовки, такие как MyLib.h
, должны содержать только типы, которые он определяет, и прототипы его функций.Если для выполнения своей работы необходимо использовать определенный тип, заголовок должен быть включен явно, поэтому, если ему нужно определение из AAA
, оно должно включать AAA.h
, а если ему нужно какое-то определение из BBB
, то оно должно включать BBB.h
, аналогично любые файлы реализации (скажем, MyLib.c
) должны явно включать все заголовки для любых определений, которые он использует, независимо от того, уверен ли, что MyLib.h
также включает их. Никогда не предполагайте, что заголовок определяет что-то неявно путем включения других заголовков.
Это легко проверить с помощью IDE, которая обычно сообщает вам, где определено имя, и, таким образом, вы можете легко понятькоторый включает файл для использования.Могут быть доступны инструменты, которые выполняют такую проверку.