Heim > Backend-Entwicklung > C++ > Wie gehe ich mit zirkulären Abhängigkeiten zwischen Headern in C um?

Wie gehe ich mit zirkulären Abhängigkeiten zwischen Headern in C um?

Linda Hamilton
Freigeben: 2024-10-26 12:11:29
Original
462 Leute haben es durchsucht

 How to Handle Circular Dependencies Between Headers in C  ?

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>
Nach dem Login kopieren
<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>
Nach dem Login kopieren

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>
Nach dem Login kopieren
<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>
Nach dem Login kopieren
In diesem Fall beschwert sich der Compiler, dass A ein nicht deklarierter Typ innerhalb von B.h. ist. Dies liegt daran, dass die Forward-Deklaration in A.h nicht sichtbar ist, wenn B.h enthalten ist.

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage