Forum: Compiler & IDEs Globale Variable unbekannt


von aaaaaa (Gast)


Lesenswert?

Hallo

ich habe in uCOS eine globale Variable in einer C-Datei mit
1
extern OS_EVENT *Semaphore

deklariert. Aber komischer Weise ist die Variable in einer anderen Datei 
unbekannt.

Sollte mit extern die Variable in den anderen Dateien nicht auch bekannt 
sein.

MfG

von Marius W. (mw1987)


Lesenswert?

Mit extern sagst du nur, dass es noch irgendwo eine Variable gibt. Der 
Speicher dafür wird aber nicht angelegt und somit existiert diese 
Variable noch nicht.

Also musst du noch in die entsprechende c-Datei, die die Variable 
bereitstellen soll ein
1
OS_EVENT *Semaphore
reinschreiben.

Gruß
Marius

von Karl H. (kbuchegg)


Lesenswert?

aaaaaa schrieb:
> Hallo
>
> ich habe in uCOS eine globale Variable in einer C-Datei mit
>
>
1
extern OS_EVENT *Semaphore
>
> deklariert. Aber komischer Weise ist die Variable in einer anderen Datei
> unbekannt.
>
> Sollte mit extern die Variable in den anderen Dateien nicht auch bekannt
> sein.

Nö.
Warum sollte es das?

Der COmpiler übersetzt jedes *.c File für sich getrennt und unabhängig 
von allen anderen. Was du in a.c reinschreibst hat für den Compiler 
keinerlei Auswirkungen oder Konsequenzen, wenn er b.c compiliert.

http://www.mikrocontroller.net/articles/FAQ#Globale_Variablen_.C3.BCber_mehrere_Dateien

von aaaaaa (Gast)


Lesenswert?

>Warum sollte es das?

Da es eine globale Variable ist und davon ausgegangen bin dass mit 
extern diese Variable auch sichtbar ist.

Genügt es nur in einer Datei das extern zu schreiben oder muss dass in 
allen Dateien vorhanden sein.

Wenn ich aber in unterschiedlichen Dateien

[c]extern OS_EVENT *Semaphore[c]

und

[c]OS_EVENT *Semaphore[c]

schreibe greift es schon auf dieselbe Variable obwohl es 
unterschiedlicher Speicher ist.

von DirkB (Gast)


Lesenswert?

Einmal im ganzen Programm muss das
1
OS_EVENT *Semaphore
 stehen.
Damit wird der Speicher für die Variable belegt.

Das
1
extern OS_EVENT *Semaphore
 kommt in jede andere Datei, aus der  auf die oben genannte Variable 
zugegriffen wird.

von Noname (Gast)


Lesenswert?

>Da es eine globale Variable ist und davon ausgegangen bin dass mit
>extern diese Variable auch sichtbar ist.

>Genügt es nur in einer Datei das extern zu schreiben oder muss dass in
>allen Dateien vorhanden sein.

>Wenn ich aber in unterschiedlichen Dateien
1
extern OS_EVENT *Semaphore

>und
1
OS_EVENT *Semaphore

>schreibe greift es schon auf dieselbe Variable obwohl es
>unterschiedlicher Speicher ist.

Hier kommen zwei resp. drei irrige Auffasssungen zusammen.

Wenn sich "es" in Deinem ersten Satz auf
1
extern OS_EVENT *Semaphore
bezieht so handelt es sich nicht um eine Variable.

Vielmehr ist das die Deklaration einer Variablen.
Diese sagt "es existiert an irgendeiner anderen Stelle im Projekt (also 
in einer anderen C-Datei) eine Variable dieses Namens. Bitte greife, 
wenn ich diesen Namen in dieser_ C-Datei verwende auf den _dort 
reservierten Speicher zu.
Die Lesart des Wortes "extern" als "mache diese Variable, von aussen 
sichtbar" ist falsch. Vielmehr muss dies, wie eben beschrieben, als 
"nimm an, das irgendwo anders eine Reservierung existiert", gelesen 
werden.

Im Gegensatz dazu ist
1
OS_EVENT *Semaphore
keine Deklaration sondern eine sog. "Definition". Hier wird tatsächlich 
Speicherplatz reserviert.

Demzufolge ist auch der Nachsatz

>...schreibe greift es schon auf dieselbe Variable obwohl es
>unterschiedlicher Speicher is
falsch. Denn der Speicher wird nie mehrfach reserviert obwohl dann alle 
Verweise doch auf die selbe Variable zugreifen. Das wäre garnicht 
sinnvoll, diesen Speicher mehrfach zu reservieren. Entweder dürfte dann 
doch nur einer benutzt werden, oder bei der Änderung einer der 
Speicherbereiche müssten alle anderen die für die selbe Variable 
reserviert sind mit geändert werden.

Ich empfehle Dir die intensive Lektüre eines guten C-Buches zu den 
Stichworten "Deklaration", "Definition" und den Schlüsselworten "extern" 
und "static".

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.