2010-01-10 3 views

Antwort

14

Es ist ein sogenannter "include guard". Der Zweck besteht darin, zu verhindern, dass die Datei mehrfach analysiert werden muss, wenn sie mehrfach enthalten ist.

+0

Und um mehrere Definitionen der gleichen Klasse zu verhindern. – James

+1

Gab es jemals eine # Importanweisung, oder ist das nur meine Vorstellung? –

+2

@Autopulated: Das ist, was er meint, indem er mehrfach geparst wird. Es gibt mehr Dinge als Klassenredefinitionen, um die man sich kümmern muss; Alle sind durch "multiple parsing" gekapselt. – GManNickG

3

Es wird ein Einschließenwächter 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 Übung, sie immer zu benutzen.

4

Es verhindert mehrfache Einschlüsse einer einzelnen Datei. Das gleiche gilt

#pragma once 

Direktive getan werden, aber diese #ifndefs sind Standard somit von jedem Compiler unterstützt.

+3

#pragma einmal. Ist eine Compiler-spezifische Erweiterung. –

+0

... aber eine weit verbreitete, um fair zu sein –

-1

Wenn eine Header-Datei eine Definition wie

int i;
enthält, wird ein Kompilierungsfehler erzeugt, wenn sie mehrmals ohne Guard eingeschlossen wird.
Wenn ifndef prüft, dass eine Präprozessorvariable nicht definiert ist (und dies nicht zum ersten Mal ist), wird sie explizit definiert, um zu vermeiden, dass sie erneut erfasst wird. In MSVC können Sie auch
#pragma once
statt ifndef verwenden.

1

Wenn ich richtig verstehe, möchten Sie wissen, ob, einschließlich der Abwesenheit von Wachen, eine Headerdatei mehrere Male einen Fehler oder ein gefährliches Verhalten verursachen kann. Dies geschieht nach dem Ausschließen mehrerer Definitionen usw.

Stellen Sie sich einen bösartigen Programmierer vor, dessen Header-Datei nicht über die Include-Wächter verfügt. 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 wie folgt schreiben:

#ifndef SZ 
#define SZ 1024 
#else 
#if SZ == 1024 
#undef SZ 
#define SZ 128 
#else 
#error "You can include me no more than two times!" 
#endif 
#endif 

Nun, wenn Sie die Header-Datei einmal schließen Sie SZ gleich 1024. bekommen Wenn Sie es zweimal enthalten, SZ wird 128. Natürlich sind die meisten Echt Weltprogrammierer sind nicht bösartig, und niemand schreibt wirklich Code wie oben.

beachten, dass der C-Standard erlaubt assert.h#include d mehr als einmal mit unterschiedlichem Verhalten abhängig davon, ob NDEBUG zum Zeitpunkt der Aufnahme von assert.h definiert ist. Also, assert.h kann keine Wachen enthalten. Das ist ein Feature, kein Fehler.