Pourquoi ne sont-elles pas incluses les gardes protègent mes fichiers d'en-tête d'une inclusion mutuelle et récursive ?
Inclure les gardes font leur emploi. Le problème vient des dépendances entre les définitions des structures de données dans les en-têtes qui s'incluent mutuellement.
Par exemple, supposons que a.h et b.h contiennent :
// a.h #ifndef A_H #define A_H #include "b.h" struct A {...}; #endif // b.h #ifndef B_H #define B_H #include "a.h" struct B {...}; #endif
Sans inclure les gardes, main.cpp ne le fera pas compiler en raison de la limite de profondeur de compilation.
Avec les gardes d'inclusion, la récursivité infinie est empêchée. Cependant, des dépendances entre les définitions demeurent :
Pour résoudre ce problème, utilisez des déclarations forward dans les en-têtes qui en ont besoin :
// b.h #ifndef B_H #define B_H struct A; // Forward declaration struct B {...}; #endif
Pourquoi ne sont-ils pas inclus des gardes empêchant plusieurs définitions ?
Inclure des gardes peut empêcher la redéfinition au sein d'une seule unité de traduction, mais pas à travers différentes unités.
Par exemple, lorsque header.h :
#ifndef HEADER_H #define HEADER_H int f() {...}; #endif
Est inclus dans plusieurs unités de traduction, telles que source1.cpp et source2.cpp :
// source1.cpp #include "header.h" // source2.cpp #include "header.h"
L'éditeur de liens se plaindra de plusieurs définitions de f(), car il voit la même définition dans des fichiers objets séparés.
Pour résoudre ce problème, utilisez le approches suivantes :
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!