Heim >Backend-Entwicklung >C++ >Wie gehe ich mit kreisförmigen Header-Einschlüssen in C um?
Frage:
Wenn Sie mit mehreren Headerdateien in C arbeiten, sollten die #include-Anweisungen vorhanden sein? innerhalb oder außerhalb von Makros platziert? Was passiert konkret, wenn zwei Klassen einander einschließen?
Antwort:
Makroplatzierung:
#include-Anweisungen sollten immer platziert werden innerhalb der Makros (#ifndef include Guards), um eine unendliche Rekursion während der Kompilierung zu verhindern.
Zirkuläre Einschlüsse:
Zirkuläre Einschlüsse treten auf, wenn zwei Klassen die Header der anderen enthalten. Um dieses Problem zu lösen, sollte eine Vorwärtsdeklaration verwendet werden, bevor eine Klasse definiert wird, die einen Verweis auf eine andere Klasse enthält.
Beispiel:
Beachten Sie die folgenden Header-Dateien A.h und B.h :
<code class="cpp">// A.h #ifndef A_H_ #define A_H_ #include "B.h" // Circular inclusion class A { B b; }; #endif // B.h #ifndef B_H_ #define B_H_ class A; // Forward declaration class B { A& a; }; #endif</code>
Hauptfunktion:
<code class="cpp">// main.cpp #include "A.h" int main() { A a; }</code>
Erklärung:
Circular Inclusion Issue: Wenn die #include-Anweisungen außerhalb der Makros platziert würden, würde der Compiler beim Versuch, beide Header einzuschließen, auf eine unendliche Rekursion stoßen.
Forward-Deklaration: In B.h eine Forward-Deklaration der Klasse A; verwendet wird. Dies informiert den Compiler darüber, dass A eine Klasse ist, ohne deren Definition einzubeziehen. Dies ermöglicht es B, einen Verweis auf A zu deklarieren.
Reihenfolge der Einschlüsse: Die Reihenfolge der Header-Einschlüsse ist ebenfalls wichtig. A.h muss vor B.h eingefügt werden, um die Vorwärtsdeklaration zu ermöglichen.
Das obige ist der detaillierte Inhalt vonWie gehe ich mit kreisförmigen Header-Einschlüssen in C um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!