Ради этого вопроса, пожалуйста, не обращайте внимания на проблемы разработки программного обеспечения, связанные с взаимными зависимостями, и сосредоточьтесь на техническом аспекте.
Пожалуйста, рассмотрите два заголовочных файла, a.h
и b.h
.Файл a.h
определяет некоторую структуру, которая требуется b.h
.Тем не менее, b.h
также определяет структуру, которая необходима для a.h
.
Насколько я понимаю, обычный метод разрешения этой циклической зависимости #include
заключается в b.h
вместо включения a.h
,он бы заранее объявил определение структуры, которое требуется от a.h
.Это будет выглядеть примерно так:
ах
// No nice typedef
struct MyThing_t {
// ...
};
Bh
// Other things omitted
typedef struct MyThing_t MyThing;
// ... proceed using MyThing
Как я понимаю,это должно компилироваться и работать.
Но - почему это работает?Как компилятор узнает имя MyThing_t
при компиляции b.h
?Какой здесь механизм?
Также - почему бы не включить typedef
также в a.h
, для использования с использованием модулей, с которыми a.h
не имеет круговой зависимости?