Hi Ich habe 3 C-Files geschrieben. Kann ich diese verschachteln, damit in einem File eine Variable gesetzt wird, die im anderen Files ausgewertet wird?? Wenn das funktionieren sollte, wo muss man dann die Variblen definieren? mfg franzi
// variable.h: extern int meine_globale_variable; // Deklaration // datei1.c: #include "variable.h" int meine_globale_variable = 0; // Definition // datei2.c: #include "variable.h" void funktionausdatei2(void) { meine_globale_variable = 23; // Zugriff } // datei3.c: #include "variable.h" void funktionausdatei3(void) { meine_globale_variable = 42; // Zugriff }
Eine beliebte Methode, vor allem bei vielen globalen Variablen, ist auch: // variable.h: #ifdef define_variables #define extern #endif extern int meine_globale_variable; // Deklaration // wird zur Definition, wenn define_variables definiert ist, // weil dann "extern" durch nichts ersetzt wird // datei1.c: #define define_variables // !!!! #include "variable.h" // hier wird definiert // datei2.c: #include "variable.h" // und hier extern deklariert void funktionausdatei2(void) { meine_globale_variable = 23; // Zugriff } // u.s.w. Der Vorteil dieser Behandlung ist, dass alle globalen Variablen nur noch in einer einzigen Datei vorkommen müssen. Gruß Johannes
Der Nachteil ist, dass du diese Systematik mit einer Initialisierung einer Variablen in Variable.h ganz leicht aushebeln kannst. extern int MeineVariable = 5; wird als Definition gewertet und das 'extern' wird ignoriert. Im Endeffekt landet man dann bei 'duplicate definitions' im Linker.
@Karl Heinz Ich hab ja nicht behauptet, dass diese Methode "wasserdicht" sei. Klar kannst Du praktisch alles, was Ansi-C-konform ist, immer noch irgendwie aushebeln. Übrigens würde Dein Beispiel auch Stefans Vorschlag aushebeln... Und mich würde mal interessieren, wofür Dein Beipiel überhaupt gut sein soll. Gruß Johannes
> wofür Dein Beipiel überhaupt gut sein soll.
Es soll einfach nur demonstrieren, dass nicht alles
Gold ist was glänzt. Mehr nicht. Ich hab niemanden kritisiert,
ich hab niemanden dafür verdammt. Gar nichts.
Ich will einfach nur einen mögliche Falle aufzeigen.
Das ging mir nämlich in meinen C Anfängen (so um 1990 rum)
einfach nicht in den Schädel: Ich hatte genau die gleiche
Systematik entdeckt und sie genauso toll gefunden. Eines Tages
habe ich dann eine Initialisierung hinzugefügt und plötzlich
'seltsame' Fehlermeldungen erhalten auf die ich mir keinen Reim
machen konnte. Und es hat mich einige Zeit gekostet herauszufinden
was da Sache ist.
Und ich finde es fair, dass wenn man eine Methode (zu Recht)
mit Vorteilen anpreist, man auch die Nachteile dazu nennen sollte:
Man kann Initialisierungen nicht in diese Systematik einbinden.
Danke für die Erläuterung. Und entschuldige bitte, wenn Dir meine Nachfrage als gegen Dich erschienen ist. So war sie bestimmt nicht gemeint, ich wollte halt nur wissen, wofür die Initialisierung einer extern deklarierten Variablen gut sein soll, wenn eh jede benutzende Instanz sie selber nach Bedarf neu besetzt. Und dass die Initialisierung in dieser Systematik nicht klappt, war mir einfach neu, weil ich derlei bisher nie gemacht habe. Gruß Johannes
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.