En-têtes s'incluant les uns les autres en C
En C , il est parfois nécessaire que les en-têtes s'incluent les uns les autres. Cependant, cela peut entraîner des problèmes, notamment lorsqu'il s'agit de savoir où placer les instructions #include.
Macros internes ou externes
En général, les instructions #include doivent être placé dans des macros, telles que #ifndef include guards. Cela empêche une récursion infinie lors de la compilation, comme le démontre l'exemple suivant :
<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>
Placer les instructions #include en dehors des macros entraîne une récursion indéfinie du compilateur en raison de l'inclusion mutuelle entre A.h et B.h.
Types non déclarés
Cependant, placer les instructions #include à l'intérieur des macros peut entraîner des problèmes avec les types non déclarés. Par exemple, considérons le code suivant :
<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>
Dans ce cas, le compilateur se plaindra que A est un type non déclaré dans B.h. En effet, la déclaration Forward dans A.h n'est pas visible lorsque B.h est inclus.
Solution : Déclarations Forward
Pour résoudre ces problèmes, il est préférable d'utiliser des déclarations Forward et incluez l'en-tête contenant la définition complète si nécessaire. Dans cet exemple, une déclaration directe de A doit être ajoutée à B.h avant la définition de B :
<code class="cpp">// 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_</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!