Question :
Lorsque vous travaillez avec plusieurs fichiers d'en-tête en C, les instructions #include doivent-elles être placé à l'intérieur ou à l'extérieur des macros ? Plus précisément, que se passe-t-il lorsque deux classes s'incluent ?
Réponse :
Placement des macros :
Les instructions #include doivent toujours être placées à l'intérieur des macros (#ifndef include guards) pour éviter une récursion infinie lors de la compilation.
Inclusions circulaires :
Les inclusions circulaires se produisent lorsque deux classes incluent les en-têtes de l'autre. Pour résoudre ce problème, une déclaration directe doit être utilisée avant de définir une classe qui inclut une référence à une autre classe.
Exemple :
Considérez les fichiers d'en-tête suivants A.h et 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>
Fonction principale :
<code class="cpp">// main.cpp #include "A.h" int main() { A a; }</code>
Explication :
Problème d'inclusion circulaire : Si les instructions #include étaient placées en dehors des macros, le compilateur rencontrerait une récursion infinie en tentant d'inclure les deux en-têtes.
Déclaration Forward : En B.h, une déclaration directe de classe UN; est utilisé. Cela informe le compilateur que A est une classe, sans inclure sa définition. Cela permet à B de déclarer une référence à A.
Ordre d'inclusion : L'ordre des inclusions d'en-tête est également important. A.h doit être inclus avant B.h pour permettre la déclaration à terme.
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!