[Gelöst] Preprocessor Header Datei: #ifndef - #define - #endif
-
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