[Gelöst] Preprocessor Header Datei: #ifndef - #define - #endif
-
Guten Morgen zusammen,
ich hab eine kurze Frage: Wenn ich in meiner IDE (welche ich jetzt nichtmehr verwende, weshalb es mich jetzt interessiert) eine Header Datei erstelle, bekomme ich nicht nur eine nette .h/.hpp Datei, sondern da steht auch gleich was nettes drin, ca. so:
#ifndef HEADER_H #define HEADER_H ... #endif // HEADER_HIch hab schon nachgeschaut. Bringt das also, dass wenn ich meine header.h an verschiedenen Stellen meines Programmes include, diese dann nicht mehrmals compiliert wird? Oder bringt es, dass wenn ich headerB.h habe, welcher header.h includiert und ich dann headerB.h und header.h includiere, der Inhalt von header.h nicht zwei Mal includiert wird? (Was eventuell auf Ersteres schließt)
Wäre über etwas Klarheit sehr dankbar. Und was mich natürlich am meisten interessiert: Soll ich diese 3 Zeilen dann auch bei meinen Header Dateien immer verwenden und ist das gut?
LG
HarteWare
-
Hallo.
HarteWare schrieb:
Bringt das also, dass wenn ich meine header.h an verschiedenen Stellen meines Programmes include, diese dann nicht mehrmals compiliert wird?
Ja.
HarteWare schrieb:
Oder bringt es, dass wenn ich headerB.h habe, welcher header.h includiert und ich dann headerB.h und header.h includiere, der Inhalt von header.h nicht zwei Mal includiert wird? (Was eventuell auf Ersteres schließt)
Ja (aber das sollte bei einer sauberen Headerstruktur nicht geschehen).
HarteWare schrieb:
Soll ich diese 3 Zeilen dann auch bei meinen Header Dateien immer verwenden und ist das gut?
Ja, aber immer eindeutige Namen nehmen (und nicht beispielsweise
int_hoder so)! Ich persönlich nehme beispielsweise solche:xLib_Crypt_RC6_hpp_includedoderyLib_TypeTraits_hpp_included
Also nach der Grammatik: LibName ## _ ## ( SubLibName ## _ ## )opt HeaderName ## _ ## HeaderExtention ## _includedEdit: Quoten eingefügt.
-
OK danke, das hätte sich soweit geklärt.
-
asfdlol schrieb:
HarteWare schrieb:
Oder bringt es, dass wenn ich headerB.h habe, welcher header.h includiert und ich dann headerB.h und header.h includiere, der Inhalt von header.h nicht zwei Mal includiert wird? (Was eventuell auf Ersteres schließt)
Ja (aber das sollte bei einer sauberen Headerstruktur nicht geschehen).
Wäre das wahr (mit der "sauberen" Struktur), könnte man sich die Includeguards sparen.
-
manni66 schrieb:
asfdlol schrieb:
HarteWare schrieb:
Oder bringt es, dass wenn ich headerB.h habe, welcher header.h includiert und ich dann headerB.h und header.h includiere, der Inhalt von header.h nicht zwei Mal includiert wird? (Was eventuell auf Ersteres schließt)
Ja (aber das sollte bei einer sauberen Headerstruktur nicht geschehen).
Wäre das wahr (mit der "sauberen" Struktur), könnte man sich die Includeguards sparen.
Nein, aus eben dem genannten Beispiel heraus.
-
Auch bei einer sauberen Struktur hat man doppelte includes.
Du hast immer header Dateien die von anderen eingebunden werden müssen.
Eine header Datei die zB eine string-Klasse zur Verfügung stellt, wird in vielen anderen Header Dateien eingebunden werden müssen.
-
manni66 schrieb:
asfdlol schrieb:
HarteWare schrieb:
Oder bringt es, dass wenn ich headerB.h habe, welcher header.h includiert und ich dann headerB.h und header.h includiere, der Inhalt von header.h nicht zwei Mal includiert wird? (Was eventuell auf Ersteres schließt)
Ja (aber das sollte bei einer sauberen Headerstruktur nicht geschehen).
Wäre das wahr (mit der "sauberen" Struktur), könnte man sich die Includeguards sparen.
Sehe ich nicht so. Zwei Header die denselben Header benötigen sind völlig normal und kommen auch in sauberen Strukturen vor (z.B. mehrere Header die
<vector>oder<memory>verwenden). Zwei Header die sich gegenseitig brauchen sollten entweder nur ein oder mehrere kleinere Header sein.
-
asfdlol schrieb:
manni66 schrieb:
asfdlol schrieb:
HarteWare schrieb:
Oder bringt es, dass wenn ich headerB.h habe, welcher header.h includiert und ich dann headerB.h und header.h includiere, der Inhalt von header.h nicht zwei Mal includiert wird? (Was eventuell auf Ersteres schließt)
Ja (aber das sollte bei einer sauberen Headerstruktur nicht geschehen).
Wäre das wahr (mit der "sauberen" Struktur), könnte man sich die Includeguards sparen.
Sehe ich nicht so. Zwei Header die denselben Header benötigen sind völlig normal und kommen auch in sauberen Strukturen vor (z.B. mehrere Header die
<vector>oder<memory>verwenden). Zwei Header die sich gegenseitig brauchen sollten entweder nur ein oder mehrere kleinere Header sein.Von gegenseitig steht da nichts.
-
Also HarteWare fragte: "Kann man mit Include-Guards gegenseitiges inkludieren verhindern?"
Ich antwortete: "Ja; in sauberen Headerstrukturen wird jedoch nicht gegenseitig inkludiert."
Du: "Nicht wahr, sonst bräuchte es da gar keine Include-Guards." (Hab ich das hier falsch verstanden?)
Ich: Erklärung, wieso es Include-Guards auch ohne gegenseitiges Inkludieren braucht.
Du: "Von gegenseitigem Inkludieren war nicht die Rede." (Dabei sagte ich doch, dass "saubere" Headerstrukturen kein gegenseitiges Inkludieren durchführen)Kann ich nicht ganz nachvollziehen.
-
asfdlol schrieb:
Also HarteWare fragte: "Kann man mit Include-Guards gegenseitiges inkludieren verhindern?"
Ja? Wo?
-
manni66 schrieb:
asfdlol schrieb:
Also HarteWare fragte: "Kann man mit Include-Guards gegenseitiges inkludieren verhindern?"
Ja? Wo?
Im OP?
HarteWare schrieb:
Oder bringt es, dass wenn ich headerB.h habe, welcher header.h includiert und ich dann headerB.h und header.h includiere, der Inhalt von header.h nicht zwei Mal includiert wird? (Was eventuell auf Ersteres schließt)
-
asfdlol schrieb:
manni66 schrieb:
asfdlol schrieb:
Also HarteWare fragte: "Kann man mit Include-Guards gegenseitiges inkludieren verhindern?"
Ja? Wo?
Im OP?
HarteWare schrieb:
Oder bringt es, dass wenn ich headerB.h habe, welcher header.h includiert und ich dann headerB.h und header.h includiere, der Inhalt von header.h nicht zwei Mal includiert wird? (Was eventuell auf Ersteres schließt)
Nein
-
asfdlol schrieb:
manni66 schrieb:
asfdlol schrieb:
Also HarteWare fragte: "Kann man mit Include-Guards gegenseitiges inkludieren verhindern?"
Ja? Wo?
Im OP?
HarteWare schrieb:
Oder bringt es, dass wenn ich headerB.h habe, welcher header.h includiert und ich dann headerB.h und header.h includiere, der Inhalt von header.h nicht zwei Mal includiert wird? (Was eventuell auf Ersteres schließt)
Nein, der TE hat wohl hiernach gefragt:
headerB.h:#include "header.h" ...header.h:
...main.cpp:
#include "header.h" #include "headerB.h" ...
-
Hoppla, ja, ergibt viel mehr Sinn, sorry an alle.
-
Alternativ kann man auch
#pragma oncebenutzen.. oder
#importstatt
#include.
Aber die Include-Guards sind die gängigste Variante.
-
oenone schrieb:
Alternativ kann man auch
#pragma oncebenutzen.. oder
#importstatt
#include.
Aber die Include-Guards sind die gängigste Variante.
AFAIK sind sie die einzige Standard konforme Variante.
-
oenone schrieb:
Alternativ kann man auch
#pragma oncebenutzen..
Besser, man benutzt es ergänzend:
#ifndef bla #define bla #pragma once … #endifCompiler müssen pragmas, die sie nicht kennen, ohne Fehler durchlassen. Das zusätzliche #pragma once kann also auf Compilern, die include-guards nicht so schlau wie GCC erkennen, die Sache beschleunigen.
oenone schrieb:
oder
#importstatt
#include.
Ich fürchte, das geht auf GCC aber nicht auf MSVC. Außerdem soll der Verwender nicht wissen müssen, ob der Header nur einmal rein darf und soll. Ganz schlechtes Design das.
-
volkard schrieb:
oenone schrieb:
oder
#importstatt
#include.
Ich fürchte, das geht auf GCC aber nicht auf MSVC. Außerdem soll der Verwender nicht wissen müssen, ob der Header nur einmal rein darf und soll. Ganz schlechtes Design das.
Ja, import ist eher bei Objective-C üblich. Da GCC die Sprache auch unterstützt, wurde es wohl auch für C und C++ übernommen.
Bei MSVC hat import außerdem eine andere Bedeutung: http://msdn.microsoft.com/en-us/library/8etzzkb6.aspx