Forum: Mikrocontroller und Digitale Elektronik C - Files verschachteln


von franzi (Gast)


Lesenswert?

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

von Stefan (Gast)


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
}

von franzi (Gast)


Lesenswert?

DANKE! ich werde es später ausprobieren

von Johannes A. (Gast)


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

von Karl H. (kbuchegg)


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.

von Johannes A. (Gast)


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

von Karl H. (kbuchegg)


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.

von Johannes A. (Gast)


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

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
Noch kein Account? Hier anmelden.