Heim  >  Artikel  >  Backend-Entwicklung  >  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
Linda HamiltonOriginal
2024-10-26 12:11:29403Durchsuche

 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>
<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>
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!

Stellungnahme:
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