Header, die einander einschließen in C
In C ist es gelegentlich notwendig, dass Header einander einschließen. Dies kann jedoch zu Problemen führen, insbesondere wenn es darum geht, wo die #include-Anweisungen platziert werden sollen.
Innere oder externe Makros
Im Allgemeinen sollten #include-Anweisungen dies tun in Makros eingefügt werden, z. B. #ifndef, einschließlich Wachen. Dies verhindert eine unendliche Rekursion während der Kompilierung, wie im folgenden Beispiel gezeigt:
<code class="cpp">// A.h #ifndef A_H_ #define A_H_ #include "B.h" class A { private: B b; public: A() : b(*this) {} }; #endif // A_H_</code>
<code class="cpp">// B.h #ifndef B_H_ #define B_H_ #include "A.h" class B { private: A& a; public: B(A& a) : a(a) {} }; #endif // B_H_</code>
Das Platzieren der #include-Anweisungen außerhalb der Makros führt dazu, dass der Compiler aufgrund der gegenseitigen Einbeziehung zwischen A.h und B.h.
Nicht deklarierte Typen
Das Platzieren der #include-Anweisungen innerhalb der Makros kann jedoch zu Problemen mit nicht deklarierten Typen führen. Betrachten Sie beispielsweise den folgenden Code:<code class="cpp">// A.h #ifndef A_H_ #define A_H_ class A; // Forward declaration #include "B.h" class A { private: B b; public: A() : b(*this) {} }; #endif // A_H_</code>
<code class="cpp">// B.h #ifndef B_H_ #define B_H_ #include "A.h" class B { private: A a; // Directly include A public: B(A& a) : a(a) {} }; #endif // B_H_</code>
Lösung: Forward-Deklarationen
Um diese Probleme zu lösen, verwenden Sie am besten Forward-Deklarationen und fügen Sie bei Bedarf den Header mit der vollständigen Definition ein. In diesem Beispiel sollte eine Vorwärtsdeklaration von A zu B.h vor der Definition von B hinzugefügt werden:Das obige ist der detaillierte Inhalt vonWie gehe ich mit zirkulären Abhängigkeiten zwischen Headern in C um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!