Maison > développement back-end > C++ > 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
Libérer: 2024-10-27 15:49:01
original
414 Les gens l'ont consulté

 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>
Copier après la connexion

Fonction principale :

<code class="cpp">// main.cpp
#include "A.h"

int main() {
  A a;
}</code>
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal