Global, Modulglobal, Lokal
-
Beim
#include
führt der Preprocessor nur eine einfache Textersetzung durch -- wie schon mehrfach erwähnt. Dem eigentlichen Compiler ist es egal, aus welchen Dateien die ÜE (Übersetzungseinheit) zusammengesetzt wird.Schreibst Du
//---- dings1.cpp ---- int i; // Definition //---- dings2.cpp ---- #include "dings1.cpp" int main() { return i; }
hast Du folgende ÜEs:
//----- ÜE1 (dings1.cpp) ----- int i; //----- ÜE2 (dings1.cpp in dings2.cpp eingefügt) ----- int i; int main() { return i; }
Hier enthält jede ÜE eine Definition von i --> Die ÜEs kannst Du also nicht linken (multiple definition of 'i').
Vielleicht recherchierst Du nochmal nach Preprocessor, Compiler und Linker. Vielleicht liest Du Dir auch nochmal den kompletten Thread durch. Einiges scheint Dir entgangen zu sein. Vielleicht besorgst Du Dir auch mal ein gutes Buch. Wenn Du Dein Alter und/oder Erfahrungsstand verrätst, kann man Dir vielleicht nen guten Buchtipp geben.
Das, was Du vielleicht willst, sieht so aus:
//---- dings.hpp ----- #ifndef MEINE_DINGS_KOPFDATEI_GUARD #define MEINE_DINGS_KOPFDATEI_GUARD extern int i; // Deklaration #endif // Include-Guard endet hier //---- dings.cpp ----- #include "dings.hpp" // nicht notwendig aber üblich und löblich //double i = 99; // würde wegen der Deklaration in dings.hpp // zu einem Fehler führen int i = 99; // Definition von i ist konsistent zur Deklaration //---- haupt.cpp ----- #include <iostream> #include "dings.hpp" int main() { std::cout << i << '\n'; // i wegen der Deklaration in dings.h bekannt. }
Gruß,
SP
-
ich hab neulich auch ne version gesehen, wo man die *.cpp nicht brauchte, ging so in etwa:
#ifdef GUARD #define EXTERN extern #endif #define GUARD EXTERN int i; #undef EXTERN
habs mir aber nicht genau angeguckt, weil ichs zu unübersichtlich fand...
bb
-
unskilled schrieb:
ich hab neulich auch ne version gesehen, wo man die *.cpp nicht brauchte, ging so in etwa:
#ifdef GUARD #define EXTERN extern #endif #define GUARD EXTERN int i; #undef EXTERN
habs mir aber nicht genau angeguckt, weil ichs zu unübersichtlich fand...
bb
Das klappt nicht.
Das kann nur absichern, daß die Definition nur einmal pro Übersetzungseinheit da ist. Dazu würde es völlig reichen, sie normal in den Header zu schreiben, dank include guards.Was klappt, ist ne andere Version:
#ifdef VON_DER_MAIN_INLUDIERT int i; #else extern int i; #endif
Sowas habe ich sogar mal geschrieben. Ich rate davon ab.
-
Persönlich finde ich, dass nur ein fehlgeschlagenes design extern benötigt, ich war noch nie in der situation wo ich es brauchte. Kann mir mal jemand ein beispiel geben, wo man so etwas brauchen könnte?
Gruß
-
jesus was black schrieb:
Persönlich finde ich, dass nur ein fehlgeschlagenes design extern benötigt, ich war noch nie in der situation wo ich es brauchte. Kann mir mal jemand ein beispiel geben, wo man so etwas brauchen könnte?
Gruß"brauchen" ist aber ein hartes wort. ich kann jede globale variable als Singleton tarnen.
-
Hallo,
vielen Dank für die vielen Antworten. Auch wenn sich meine Fragen manchmal ein bisschen überschneiden, dann bin dennoch über jede Antwort froh.@SP: Ich bin 17 Jahre alt und bringe mit C++ alleine bei (da ich keinen kenne, der diese Sprache auch leidenschaftlich kann/lernt.) Ich habe mir ein gutes Buch gekauft (C++ lernen und professionell anwenden von Ulla Kirch Prinz und Peter Prinz). Die Sache ist einfach nur, dass ich schon mehrere Bücher durchgearbeitet habe und dieses mein erstes "professionelles" ist. Die davor waren immer "für Kids" etc. Ich arbeite die Kapitel durch und
schreibe alle Fragen aus, recherchiere im Internet und frage schließlich euch, da ihr die einzigen seit, die mir helfen könnt. Dies mache ich hauptsächlich in den Ferien, weshalb meine Postanzahl in den Ferien immer rapide steigtIch danke euch für eure Hilfe und bitte euch über die eine oder andere indirekt wiederholte oder auch nicht so kluge Frage hinwegzusehen!
Ich finde dieses Forum echt super!
Bis dann
lg, freakC++