Az álmoskönyvek szerint nem túl jó ötlet a guard-on kívülre kódot rakni. A másik nem jó ötlet, hogy a fordítás függ attól, hogy adott include előtt mi van.
Valami ilyesmire van szükséged:
a.h:
#ifndef A_H
#define A_H
struct B;
struct A
{
struct B *b;
};
#endif
És az a.c -ben szerepel az include b.
Szerk.:
Jól tévedek, hogy a header-ben vannak kifejtett függvények, amik használni akarják a másik header-ből jövő struct elemeit?
Ebben az esetben ezert nem működik (tegyük fel, hogy elősször az a.h-t húzza be):
struct A;
struct B;
struct A;
struct B
{
struct A *a;
};
// b.h tovabbi tartalma tartalama
struct A
{
struct B *b;
};
// a.h tovabbi tartalma
Ez azért lesz, mert először behúzza az a.h-t, és itt definiálja is a guard macrót, az a.h behúzza a b.h-t, ami szintén definiálja a saját guard macrójat, a b.h behúzza az a.h-t, de itt már létezik az a guard makrója, ezért innen már csak a 'struct A;' kerül bele.
"If you must mount the gallows, give a jest to the crowd, a coin to the hangman, and make the drop with a smile on your lips" The Wheel of Time series