Global Variablen in Header Dateien setzen

Gast #786686
Lesenswert?

Hallo. Bin noch ziemlich neu in der Materie und brauche eure Hilfe. Habe 
einen gut funktionierenden Code geschrieben und bin jetzt dabei alles 
etwas uebersichtlicher zu gestalten. Ich wuerde jetzt gerne Teile meines 
Codes in zusaetzliche Source Files transferieren. Ich habe nun meinen 
header file erstellt und den dazugehoerigen sourcefile.
Jetzt meine Frage. Ich moechte globalvariablen in mehreren sourcefiles 
verwenden. ZB Uhrzeitvariablen. Wenn ich diese Variablen nur im 
Mainsourcefile definiere, gibt der Compiler eine Fehlermeldung, dass ich 
die Variablen in den anderen Sourcecodes auch definieren muss. Wo muss 
ich die Variablen und wie muss ich sie definieren, sodass ich sie 
untereinander austauschen kann.
Wahrscheinlich ziemlich trivial. Nur leider hab ich kein Buch zur Hand 
und vielleicht hat jemand ein paar Sekunden Zeit, mir die Loesung zu 
sagen.
#786704
Lesenswert?

1.: Alex hat recht, auch wenn es ein wenig lapidar ausgedrückt ist.

2.: Es gibt die Begriffe "Deklaration" und "Definition". Eine Variable 
kann beliebig oft deklariert, aber nur einmal definiert werden. Bei 
einer Deklaration wird lediglich dem Compiler mitgeteilt, dass die 
Variable irgendwo existiert und dass er sie benutzen kann. Eine 
Definition hingegen reserviert Speicherplatz.

Wenn Du eine Variable, die in einer anderen Datei als der aktuell 
compilierten definiert ist, benutzen willst, musst Du dem Compiler 
mitteilen, dass diese Variable existiert und dass sie den Typ X hat. 
Diese Mitteilung macht man, indem man die Variable mit dem Schlüsselwort 
extern deklariert. Also
1
extern unsigned int foo;
sagt dem Compiler, dass irgendwo in einer anderen Quelldatei, die der 
Compiler in dem Moment nicht sehen kann, eine Variable foo vom Typ 
unsigned int existiert.

Wird das extern weggelassen, dann geht der Compiler von einer 
Definition aus und wenn er mehrfache Definitionen ein und derselben 
Variable zu sehen bekommt, dann gibt es eine entsprechende Fehlermeldung 
à la "multiple definition of...".

Also: In der entsprechenden Quelldatei die Variable einmal definieren 
und in der dazugehörigen Headerdatei eine extern -Deklaration und die 
Headerdatei in alle Sourcen einbinden, die die Variable benutzen sollen.
Gast #786896
Lesenswert?

vergiss den extern - Bezeichner , und verwende für den globalen Zugriff 
auf Variablen lieber SET (z.B. void SET_Led (unsigned char ucValue) ) 
bzw. GET (z.B. unsigned char Get_LedState (void) ) Funktionen. Diese 
musst Du dir zwar selbst schreiben, brauchen etwas mehr ROM tragen aber 
zur Übersicht/Modularisierung bei.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren