Heim > Backend-Entwicklung > C++ > Wie gehen Include Guards mit gegenseitiger Rekursion und mehreren Symboldefinitionen um?

Wie gehen Include Guards mit gegenseitiger Rekursion und mehreren Symboldefinitionen um?

DDD
Freigeben: 2024-12-23 06:17:20
Original
420 Leute haben es durchsucht

How Do Include Guards Handle Mutual Recursion and Multiple Symbol Definitions?

Warum bieten Include-Guards keinen gegenseitigen Rekursionsschutz oder verhindern mehrere Symboldefinitionen?

Gegenseitige Rekursion

Include-Guards schützen tatsächlich Ihre Header-Dateien aus gegenseitiger, rekursiver Inklusion. Die Verwirrung entsteht, weil das Problem nicht bei den Wächtern liegt, sondern darin, wie Datenstrukturen in den Header-Dateien definiert werden.

Betrachten Sie das Beispiel:

// 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() {
  ...
}
Nach dem Login kopieren

Auch mit Include-Wächtern, main. cpp kann nicht kompiliert werden, da Klasse A (erforderlich für Klasse B) eine unvollständige Definition hat. Weiterleitungsdeklarationen lösen dieses Problem:

// b.h
#ifndef B_H
#define B_H

// Forward declare A to avoid circular inclusion
struct A;

struct B {
  A* pA;
};

#endif // B_H
Nach dem Login kopieren

Mehrere Definitionen

Include-Schutzvorrichtungen schützen vor mehreren Definitionen innerhalb einer einzelnen Übersetzungseinheit, jedoch nicht über verschiedene Einheiten hinweg. Zur Veranschaulichung:

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

...
Nach dem Login kopieren

Selbst mit Include-Guards beschwert sich der Linker über mehrere Definitionen von f(). Die Lösung besteht darin, die Funktion in nur einer Übersetzungseinheit zu definieren oder das Schlüsselwort inline zu verwenden, um den Compiler anzuweisen, den Funktionskörper an jeder Aufrufstelle einzubinden.

Das obige ist der detaillierte Inhalt vonWie gehen Include Guards mit gegenseitiger Rekursion und mehreren Symboldefinitionen um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage