Maison  >  Article  >  développement back-end  >  Comment gérer les inclusions d’en-têtes circulaires en C ?

Comment gérer les inclusions d’en-têtes circulaires en C ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-27 15:49:01229parcourir

 How to Handle Circular Header Inclusions in C  ?

En-têtes s'incluant les uns les autres en C

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn