Warum verhindern meine Include-Guards nicht die rekursive Einbeziehung und die Definition mehrerer Symbole?

Zwei häufige Fragen zuWachen einschließen:

ERSTE FRAGE:

Warum werden meine Header-Dateien nicht durch Schutzmaßnahmen geschützt?gegenseitige, rekursive Inklusion? Ich erhalte immer wieder Fehler über nicht vorhandene Symbole, die offensichtlich vorhanden sind, oder sogar seltsame Syntaxfehler, wenn ich etwas wie das Folgende schreibe:

"Ah"

#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"

#include "a.h"
int main()
{
    ...
}

Warum erhalte ich Fehler beim Kompilieren von "main.cpp"? Was muss ich tun, um mein Problem zu lösen?

ZWEITE FRAGE:

Warum werden Wachen nicht davon abgehalten?mehrere Definitionen? Wenn mein Projekt beispielsweise zwei Dateien enthält, die denselben Header enthalten, beschwert sich der Linker manchmal darüber, dass ein Symbol mehrmals definiert wurde. Zum Beispiel:

"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"
...

Warum passiert dies? Was muss ich tun, um mein Problem zu lösen?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage