Warum beginnt jede .h-Datei mit #ifndef #define #endif? Wir können das Programm ohne diese Richtlinien sicherlich kompilieren.
Es verhindert mehrfache Einschlüsse einer einzelnen Datei. Dasselbe kann mit
gemacht werden %Vor%Direktive, aber diese #ifndefs sind Standard und werden daher von jedem Compiler unterstützt.
Es wird ein "include guard" genannt. Sie können ohne sie schreiben, bis Sie mit dem Schreiben großer Programme beginnen und herausfinden, dass Sie die gleiche .h-Datei mehr als einmal direkt oder indirekt aus einer C-Datei einbeziehen müssen. Dann ohne Wächter würden Sie mehrere Definitionsfehler bekommen, aber mit ihnen wird der Inhalt der Headerdatei nur einmal analysiert und alle nachfolgenden Male übersprungen, um diese Fehler zu vermeiden. Es ist eine gute Praxis, sie immer zu benutzen.
Wenn ich es richtig verstehe, möchten Sie wissen, ob, wenn keine Wächter eingeschlossen sind, eine Headerdatei mehrere Male einen Fehler oder ein gefährliches Verhalten verursachen kann. Dies ist nach dem Ausschließen mehrerer Definitionen usw.
Stellen Sie sich einen bösartigen Programmierer vor, dessen Header-Datei nicht die Wächter enthält. Seine Header-Datei definiert ein Makro, SZ
, das eine Größe ist, die Sie für Ihre statisch zugewiesenen Arrays verwenden. Der Programmierer könnte seine Header-Datei so schreiben:
Nun, wenn Sie die Header-Datei einmal einfügen, erhalten Sie SZ
gleich 1024. Wenn Sie es zweimal einschließen, wird SZ
zu 128. Natürlich sind die meisten echten Programmierer nicht böswillig und niemand wirklich schreibt Code wie oben.
Beachten Sie, dass der C-Standard assert.h
mehr als einmal mit unterschiedlichem Verhalten #include
d zulässt, abhängig davon, ob NDEBUG
zum Zeitpunkt der Aufnahme von assert.h
definiert wurde. Daher kann assert.h
keine Wächter enthalten. Das ist ein Feature, kein Bug.
Wenn eine Headerdatei eine Definition wie
enthältint i;als, mehrmals ohne Guard eingeschlossen, erzeugt einen Kompilierungsfehler.
#pragma onceanstelle von
ifndef
verwenden.
Tags und Links c c++ c-preprocessor include-guards