Les gardes d'inclusion protègent effectivement vos fichiers d'en-tête de l’inclusion mutuelle et récursive. La confusion vient du fait que le problème ne vient pas des gardes, mais de la manière dont les structures de données sont définies dans les fichiers d'en-tête.
Considérez l'exemple :
// a.h #ifndef A_H #define A_H #include "b.h" struct A { ... }; #endif // A_H // b.h #ifndef B_H #define B_H #include "a.h" struct B { A* pA; }; #endif // B_H // main.cpp #include "a.h" int main() { ... }
Même avec des gardes d'inclusion, main. cpp ne parviendra pas à compiler car la classe A (nécessaire pour la classe B) a une définition incomplète. Les déclarations directes résolvent ce problème :
// b.h #ifndef B_H #define B_H // Forward declare A to avoid circular inclusion struct A; struct B { A* pA; }; #endif // B_H
Inclure des protections pour protéger contre plusieurs définitions au sein d'une seule unité de traduction, mais pas entre différentes unités. Pour illustrer :
// header.h #ifndef HEADER_H #define HEADER_H int f() { return 0; } #endif // HEADER_H // source1.cpp #include "header.h" // Redundant include causing multiple definitions #include "header.h" int main() { ... } // source2.cpp #include "header.h" ...
Même avec des gardes d'inclusion, l'éditeur de liens se plaindra de plusieurs définitions de f(). La solution consiste à définir la fonction dans une seule unité de traduction ou à utiliser le mot-clé inline pour demander au compilateur d'intégrer le corps de la fonction sur chaque site d'appel.
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!