En-têtes s'incluant les uns les autres en C
Les fichiers d'en-tête C peuvent s'inclure les uns les autres, mais certaines directives doivent être suivies pour éviter les erreurs de compilation.
Placement des instructions d'inclusion
Déclarations avancées
Considérez le code suivant où deux classes, A et B, s'incluent :
<code class="cpp">// A.h #ifndef A_H_ #define A_H_ #include "B.h" class A { public: A() : b(*this) {} private: B b; }; #endif</code>
<code class="cpp">// B.h #ifndef B_H_ #define B_H_ #include "A.h" class B { public: B(A& a) : a(a) {} private: A& a; }; #endif</code>
Dans ce scénario, le compilateur rencontre d'abord la classe B, mais A n'a pas encore été déclarée. Pour résoudre ce problème, une déclaration directe de A doit être incluse avant la définition de B :
<code class="cpp">// B.h #ifndef B_H_ #define B_H_ class A; // Forward declaration of class A #include "A.h" class B { public: B(A& a) : a(a) {} private: A& a; }; #endif</code>
Cette déclaration directe informe le compilateur que A est une classe, même si sa définition complète n'est pas encore disponible.
En pratique
En général, les instructions #include doivent être placées à l'intérieur des gardes d'inclusion, et les déclarations forward doivent être utilisées lorsqu'un en-tête doit faire référence à une classe définie dans un en-tête inclus ultérieurement. En suivant ces directives, vous pouvez éviter les erreurs de compilation causées par les inclusions circulaires.
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!