Из заголовочного файла a.h
просто удалите строку #include "b.h"
. Предварительная декларация struct B;
- это все, что вам нужно.
Это изменение исправит циклическую зависимость include и сделает любой код, использующий эти заголовки, более разумным.
Затем, где бы вы ни хотели использовать структуру B
, просто включите b.h
и используйте ее с ключевым словом struct
или без него.
Код для иллюстрации: заголовочный файл a.h
:
/* a.h */
struct B;
typedef struct A {
void (*func)(struct B* b);
} A;
Заголовочный файл b.h
:
/* b.h */
#include "a.h"
typedef struct B {
A a;
} B;
Файл, который использует следующие заголовочные файлы:
/* some_file.c */
#include "b.h"
void fun() {
B someb;
someb.a.func(&someb);
}
void fun2() {
struct B someb;
someb.a.func(&someb);
}
Оба fun
и fun2
в порядке (с точки зрения компилятора - func
не инициализирован, поэтому вызов его вызовет проблему во время выполнения).