Heim >Backend-Entwicklung >C++ >Wie gehe ich mit kreisförmigen Header-Einschlüssen in C um?

Wie gehe ich mit kreisförmigen Header-Einschlüssen in C um?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-27 15:49:01330Durchsuche

 How to Handle Circular Header Inclusions in C  ?

Header, die einander in C einschließen

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!

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