78 votes

Pourquoi mes gardes d'inclusion ne préviennent-ils pas l'inclusion récursive et les définitions de symboles multiples?

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X