Visual C++ 2005 & Include
-
Hallo,
evtl. kann mir hier jemand weiterhelfen, suchen hat mir meine Frage(n) leider nicht beantwortet.
Also, ich nutze VC05 und mich würde nun mal interessieren, wie der Kompiler denn eigentlich seine Dateien verknüpft.
Ich bin davon ausgegangen dass ein #include "x.y" den Inhalt der Datei x.y sozusagen an die Stelle, an der das include steht, kopiert - und der Kompiler das dann als eine Datei betrachted. Ist aber wohl nicht so.
Denn wenn ich z.B. in einem Projekt in die Datei main.cpp schreibe:#include "eins.h" #include "zwei.h"ist in zwei.h der Inhalt von eins.h unbekannt. Ich muss also in zwei.h eins.h nochmal einbinden.
Interessanterweise gibt er mir dann einen eventuell vorhandenen Fehler in eins.h 2 mal aus -> wird ja auch zweimal eingebunden. Aber warum kennt zwei.h die Deklarationen aus eins.h ohne erneutes Include nicht?
Was mich weiterhin verwundert, dass man .cpp-Dateien nicht per #include einbinden kann (wenn ichs doch probiere, meckert er mir alles als doppelt definiert an) - er kompiliert wohl automatisch alles, was im Projekt ist. Warum macht er dass dann mit den ".h" nicht auch?
Irgendwie ist mir dieses Verhalten unklar, und auch, was wann wo bekannt ist.
Ich hoffe, jemand kann mich aufklären
Gruß!
-
_Chris schrieb:
Hallo,
evtl. kann mir hier jemand weiterhelfen, suchen hat mir meine Frage(n) leider nicht beantwortet.
Also, ich nutze VC05 und mich würde nun mal interessieren, wie der Kompiler denn eigentlich seine Dateien verknüpft.
Ich bin davon ausgegangen dass ein #include "x.y" den Inhalt der Datei x.y sozusagen an die Stelle, an der das include steht, kopiert - und der Kompiler das dann als eine Datei betrachted.Doch so ist es... Du kannst es mit der Compiler-Option "/P" nachprüfen...
-
ist in zwei.h der Inhalt von eins.h unbekannt.
Hast du eventuell die "zwei.h" noch irgendwo anders (alleine) verwendet? Wenn ja, beziehen sich die Fehler über unbekannte Bezeichner höchstwahrscheinlich darauf.
Interessanterweise gibt er mir dann einen eventuell vorhandenen Fehler in eins.h 2 mal aus -> wird ja auch zweimal eingebunden.
Um das zu Umgehen, gibt es Include-Guards.
(deren Wirkung ist recht simpel - wenn der selbe Header doppelt eingebunden werden soll, wird beim zweiten Mal der Dateiinhalt ausmaskiert)PS: Klar könntest du auch CPP-Files per #include einbinden und H-Files direkt compilieren, nur macht das idR wenig Sinn. Der VC compilert dir normalerweise alle CPP's in deinem Projekt - und wenn du einen davon per #include eingebunden hast, gehen seine Definitionen doppelt an den Linker.
-
Incluge Guards wurden von CStoll ja schon angesprochen. Wenn man es nur mit den MS Compilern zu tun hat dann genügt #pragma once
Das hat den großen Vorteil, dass die entsprechende Datei gar nicht mehr gelesen wird sondern bereits beim #include übersprungen wird.
-
#pragma once gibts mittlerweile (wenn ich mich recht erinnere) sogar für den GCC! Ist fast defacto-Standard. Verlassen kann man sich darauf natürlich nicht, aber mit MSVC und GCC sind die meist genutzt Mainstream-Compiler abgedeckt.