Deux questions fréquentes au sujet d'inclure des gardes: (*)
PREMIÈRE QUESTION:
Pourquoi ne pas inclure les gardes qui protègent mes fichiers d'en-tête de mutuelle, récursive de l'inclusion? Je continue à recevoir des erreurs non-existants symboles qui sont de toute évidence il y ou encore plus étrange des erreurs de syntaxe à chaque fois que j'écris quelque chose comme ce qui suit:
//================================================
// a.h
#ifndef A_H
#define A_H
#include "b.h"
...
#endif // A_H
//================================================
// b.h
#ifndef B_H
#define B_H
#include "a.h"
...
#endif // B_H
//================================================
// main.cpp
//
// I am getting errors when compiling this...
#include "a.h"
int main()
{
...
}
Pourquoi est-ce arrivé? Que dois-je faire pour résoudre mon problème?
DEUXIÈME QUESTION:
Pourquoi ne pas inclure les gardes de prévenir les multiples définitions? Par exemple, quand mon projet contient deux fichiers qui contiennent le même en-tête, parfois, l'éditeur de liens se plaint de certains symbole étant défini plusieurs fois. Par exemple:
//================================================
// header.h
#ifndef HEADER_H
#define HEADER_H
int f()
{
return 0;
}
#endif // HEADER_H
//================================================
// source1.cpp
#include "header.h"
...
//================================================
// source2.cpp
#include "header.h"
...
Pourquoi est-ce arrivé? Que dois-je faire pour résoudre mon problème?
(*): Cette auto-répondu à la question est destiné à faire partie du c++faq archives. Il y a d'innombrables questions sur StackOverflow de gens qui ont des problèmes à cause d'une incompréhension fondamentale de ce que comprennent les gardes sont, les problèmes qu'elles sont censées résoudre, et à quels problèmes ils ne parviennent pas à résoudre. Cependant, je ne pouvais pas trouver un très clair, vaste réponse qui aborde les deux des problèmes les plus fréquents qui ont tendance à se présenter dans une manière qui peut être facilement comprise par les débutants. C'est pourquoi j'ai écrit ma propre Q&A, dans l'espoir qu'il aidera à combler l'écart. Si vous trouvez cette entrée redondant, veuillez accepter mes excuses pour involontairement introduire du bruit et de voter pour le fermer.