2009-10-31 6 views
321

Ich habe wie dies in der Regel beim Start der Header-Dateien zu sehen Code:Warum werden #ifndef und #define in C++ - Headerdateien verwendet?

#ifndef HEADERFILE_H 
#define HEADERFILE_H 

Und am Ende der Datei ist

#endif 

Was ist der Zweck davon?

+22

+1 - Ich hatte auch gleiche Zweifel, und bekam viel mehr gute Antwort hier, kann für zukünftige Besucher nützlich sein: http://StackOverflow.com/Q/3246803/1134940 –

+5

Ich möchte hinzufügen, dass Sie können benutze auch ** # pragma once **, das ist alles was du tun musst und es dient demselben Zweck wie ifndef. Zum Vergleich der beiden, siehe: http://stackoverflow.com/questions/1143936/pragma-once-vs-in-clude-guards – Dimension

+2

Am besten zu erwähnen, was ein '# Pragma' ist: Es aktiviert eine Compiler-spezifische Funktion. Obwohl "#pragma once" * sehr * weit verbreitet ist, ist es nicht Standard. – Potatoswatter

Antwort

369

Diese heißen #include guards.

Sobald der Header enthalten ist, prüft er, ob ein eindeutiger Wert (in diesem Fall HEADERFILE_H) definiert ist. Wenn es nicht definiert ist, definiert es es und fährt mit dem Rest der Seite fort.

Wenn der Code erneut eingefügt wird, schlägt die erste ifndef fehl, was zu einer leeren Datei führt.

Das verhindert doppelte Deklaration von Bezeichnern wie Typen, Aufzählungen und statischen Variablen.

+3

Mmm interresting. Ich habe VC++ beendet, weil es mir Fehler über Doppeldefinitionen gab.Vergiss, ich bin jetzt ein Objective-C-Codierer =) –

+0

Koning Baard XIV: VC hat sogar eine '#pragma once', die das gleiche tut :-) – Joey

+63

Auch verhindert es rekursive Einschlüsse ... Stellen Sie sich vor" alice.h "beinhaltet" bob.h "und" bob.h "beinhaltet" alice.h "und sie haben keine Wächter ... –

21
#ifndef <token> 
/* code */ 
#else 
/* code to include if the token is defined */ 
#endif 

#ifndef überprüft, ob die angegebene Token #defined früher in der Datei oder in einer Datei enthalten ist; wenn nicht, enthält es den Code zwischen ihm und dem schließenden #else oder, wenn kein #else vorhanden ist, #endif Aussage. #ifndef wird häufig verwendet, um Headerdateien idempotent zu machen, indem ein Token definiert wird, sobald die Datei eingeschlossen wurde, und überprüft wird, dass das Token nicht an der Spitze dieser Datei steht.

#ifndef _INCL_GUARD 
#define _INCL_GUARD 
#endif 
+3

Bezeichner, die mit einem Unterstrich beginnen, sind reserviert. Sie sollten sie nicht selbst definieren. Verwenden Sie etwas wie '#ifndef H_HEADER_NAME'. –

+5

Ich weiß, dass dies ein alter Kommentar ist, aber die Unterstreichungsbeschränkung gilt nur für "externe Bezeichner" - Bezeichner, die in der Symboltabelle des kompilierten Objekts landen könnten, d. H. Globale Variablen und Funktionsnamen. Es gilt nicht für Makronamen. – Stu

+1

Stimmt Stus Kommentar? Ich lese gerade https://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier und jetzt bin ich mir nicht so sicher. – Will

2

Dies verhindert die mehrfache Aufnahme der gleichen Header-Datei mehrere Male.

#ifndef __COMMON_H__ 
#define __COMMON_H__ 
//header file content 
#endif 

Angenommen, Sie haben diese Headerdatei in mehrere Dateien eingefügt. Also das erste Mal __COMMON_H__ ist nicht definiert, es wird definiert und Header-Datei enthalten.

Wenn das nächste Mal __COMMON_H__ definiert ist, wird es nicht erneut eingeschlossen.

Verwandte Themen