Heim > Backend-Entwicklung > C++ > Warum können Include Guards keine gegenseitige Rekursion und mehrere Definitionen verhindern?

Warum können Include Guards keine gegenseitige Rekursion und mehrere Definitionen verhindern?

Susan Sarandon
Freigeben: 2024-12-30 17:20:17
Original
277 Leute haben es durchsucht

Why Do Include Guards Fail to Prevent Mutual Recursion and Multiple Definitions?

Warum verhindern Include-Guards nicht die gegenseitige, rekursive Inklusion?

Include-Guards schützenHeader-Dateien vor gegenseitiger, rekursiver Inklusion.

Das Problem entsteht, wenn Abhängigkeiten zwischen den Definitionen von Datenstrukturen in sich gegenseitig einschließenden Headern bestehen. Zum Beispiel:

// a.h
#include "b.h"

struct A
{
    ...
};

// b.h
#include "a.h"

struct B
{
    A* pA; // error: class A is forward-declared but not defined
};
Nach dem Login kopieren

Um dieses Problem zu beheben, sollten Forward-Deklarationen anstelle von Include-Guards verwendet werden:

// b.h
#include "a.h"

// Forward declaration of A
struct A;

struct B
{
    A* pA;
};
Nach dem Login kopieren

Warum verhindern Include-Guards nicht mehrere Definitionen?

Include-Guards schützen einen Header vor redundanten Einschlüssen in derselben Übersetzungseinheit. Aufgrund ihrer Präsenz in verschiedenen Übersetzungseinheiten können jedoch dennoch mehrere Definitionen auftreten.

Um dieses Problem zu beheben, kann das Inline-Schlüsselwort verwendet werden, um mehrere Definitionen in verschiedenen Übersetzungseinheiten zuzulassen:

// header.h
inline int f()
{
    ...
}
Nach dem Login kopieren

Alternativ kann die Funktionsdefinition in eine separate Quelldatei verschoben werden, um Mehrfachdefinitionen zu verhindern:

// source.cpp
int f()
{
    ...
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWarum können Include Guards keine gegenseitige Rekursion und mehrere Definitionen verhindern?. 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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage