C - Files verschachteln

Gast #427558
Lesenswert?
• ▲
▼
// 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
}
Gast #427705
Lesenswert?
• ▲
▼
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
#427767
Lesenswert?
• ▲
▼
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.
Gast #427778
Lesenswert?
• ▲
▼
@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
#428109
Lesenswert?
• ▲
▼
> 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.
Gast #428117
Lesenswert?
• ▲
▼
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.