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

Comment gérer les dépendances circulaires entre les en-têtes en C ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-26 12:11:29403parcourir

 How to Handle Circular Dependencies Between Headers in C  ?

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!

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