Include-Guards schützen tatsächlich Ihre Header-Dateien aus gegenseitiger, rekursiver Inklusion. Die Verwirrung entsteht, weil das Problem nicht bei den Wächtern liegt, sondern darin, wie Datenstrukturen in den Header-Dateien definiert werden.
Betrachten Sie das Beispiel:
// a.h #ifndef A_H #define A_H #include "b.h" struct A { ... }; #endif // A_H // b.h #ifndef B_H #define B_H #include "a.h" struct B { A* pA; }; #endif // B_H // main.cpp #include "a.h" int main() { ... }
Auch mit Include-Wächtern, main. cpp kann nicht kompiliert werden, da Klasse A (erforderlich für Klasse B) eine unvollständige Definition hat. Weiterleitungsdeklarationen lösen dieses Problem:
// b.h #ifndef B_H #define B_H // Forward declare A to avoid circular inclusion struct A; struct B { A* pA; }; #endif // B_H
Include-Schutzvorrichtungen schützen vor mehreren Definitionen innerhalb einer einzelnen Übersetzungseinheit, jedoch nicht über verschiedene Einheiten hinweg. Zur Veranschaulichung:
// header.h #ifndef HEADER_H #define HEADER_H int f() { return 0; } #endif // HEADER_H // source1.cpp #include "header.h" // Redundant include causing multiple definitions #include "header.h" int main() { ... } // source2.cpp #include "header.h" ...
Selbst mit Include-Guards beschwert sich der Linker über mehrere Definitionen von f(). Die Lösung besteht darin, die Funktion in nur einer Übersetzungseinheit zu definieren oder das Schlüsselwort inline zu verwenden, um den Compiler anzuweisen, den Funktionskörper an jeder Aufrufstelle einzubinden.
Das obige ist der detaillierte Inhalt vonWie gehen Include Guards mit gegenseitiger Rekursion und mehreren Symboldefinitionen um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!