Kopfzeilen, die einander einschließen
In C ist es gelegentlich notwendig, dass Kopfzeilen einander einschließen. Dies kann jedoch zu Problemen führen, insbesondere wenn es darum geht, wo die #include-Anweisungen platziert werden sollen.
Innerhalb oder außerhalb von 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:
// A.h
#ifndef A_H_
#define A_H_
#include "B.h"
class A {
private:
B b;
public:
A() : b(*this) {}
};
#endif // A_H_
// 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_
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 führen nicht deklarierte Typen. Betrachten Sie beispielsweise den folgenden Code:
// 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_
// 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_
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, ist es am besten, Forward-Deklarationen zu verwenden 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:
// B.h
#ifndef B_H_
#define B_H_
class A; // Forward declaration
#include "A.h"
class B {
private:
A a; // Directly include A
public:
B(A& a) : a(a) {}
};
#endif // B_H_
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3