Heim > Backend-Entwicklung > C++ > Warum können meine Include-Schutzvorrichtungen die rekursive Einbeziehung und mehrere Symboldefinitionen nicht verhindern?

Warum können meine Include-Schutzvorrichtungen die rekursive Einbeziehung und mehrere Symboldefinitionen nicht verhindern?

Mary-Kate Olsen
Freigeben: 2024-12-22 19:37:11
Original
552 Leute haben es durchsucht

Why Are My Include Guards Failing to Prevent Recursive Inclusion and Multiple Symbol Definitions?

Warum verhindern meine Include-Schutzvorrichtungen nicht die rekursive Inklusion und mehrere Symboldefinitionen?

ERSTE FRAGE:

Warum sind sie nicht enthalten? Wachen, die meine Header-Dateien vor gegenseitiger, rekursiver Manipulation schützen Inklusion?

Einbeziehende Wachen machen ihren Job. Das Problem ergibt sich aus Abhängigkeiten zwischen den Definitionen von Datenstrukturen in sich gegenseitig einschließenden Headern.

Angenommen, a.h und b.h enthalten Folgendes:

// a.h
#ifndef A_H
#define A_H
#include "b.h"
struct A {...};
#endif

// b.h
#ifndef B_H
#define B_H
#include "a.h"
struct B {...};
#endif
Nach dem Login kopieren

Ohne Include-Guards funktioniert main.cpp nicht kompilieren aufgrund der Kompilierungstiefenbeschränkung.

Mit Include-Guards wird eine unendliche Rekursion verhindert. Allerdings bleiben Abhängigkeiten zwischen Definitionen bestehen:

  • Während der Kompilierung von a.h stößt der Präprozessor auf #include „b.h“ und verarbeitet es.
  • Während der Verarbeitung von b.h stößt er auf #include „a.h“ und verarbeitet es erneut.
  • Dadurch entsteht eine Abhängigkeit, bei der A definiert werden muss, bevor B definiert werden kann definiert.

Um dieses Problem zu beheben, verwenden Sie Forward-Deklarationen in Headern, die sie benötigen:

// b.h
#ifndef B_H
#define B_H
struct A; // Forward declaration
struct B {...};
#endif
Nach dem Login kopieren

ZWEITE FRAGE:

Warum sind sie nicht enthalten? Schutzvorrichtungen, die mehrere Definitionen verhindern?

Einschließliche Schutzvorrichtungen können eine Neudefinition innerhalb einer einzelnen Übersetzungseinheit verhindern, jedoch nicht über verschiedene hinweg Einheiten.

Zum Beispiel, wenn header.h:

#ifndef HEADER_H
#define HEADER_H
int f() {...};
#endif
Nach dem Login kopieren

in mehreren Übersetzungseinheiten wie source1.cpp und source2.cpp enthalten ist:

// source1.cpp
#include "header.h"

// source2.cpp
#include "header.h"
Nach dem Login kopieren

Der Linker wird sich über mehrere Definitionen von f() beschweren, da er dieselbe Definition in separaten Objektdateien sieht.

Um dieses Problem zu lösen, verwenden Sie Folgendes Ansätze:

  • Inline-Schlüsselwort: Weist den Compiler an, den Funktionskörper zu inline, sodass mehrere Definitionen ohne Linkerfehler möglich sind.
  • Statisches Schlüsselwort: Gibt der Funktion eine interne Verknüpfung und erstellt eine private Kopie für jede Übersetzungseinheit.
  • Unbenannt Namespace: Durch die Deklaration der Funktion in einem unbenannten Namespace erhält sie eine interne Verknüpfung, wodurch mehrere Definitionen verhindert werden.

Das obige ist der detaillierte Inhalt vonWarum können meine Include-Schutzvorrichtungen die rekursive Einbeziehung und mehrere Symboldefinitionen nicht 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