leontra schrieb:
> #ifdef MAIN
> #define EXT
> #else
> #define EXT extern
> #endif
Dieser Präprozessor-Trick ist dafür gedacht, dass man globale Variablen
sowohl
- global definieren
- global extern deklarieren
kann. Dann muss man das nicht doppelt machen.
> extern short globale_start;
Wenn Du obigen Trick tatsächluch nutzen willst, dann musst Du
stattdessen schreiben:
1 | EXT short globale_start;
|
Dann wird sie, wenn Du die Header-Datei in main.c einbindest, definiert,
denn EXT wird eliminiert und das Ergebnis des Preprocessors ist:
In jeder anderen C-Datei, wo Du den Header einbindest, wird daraus:
1 | extern short globale_start;
|
> und eine c.-Datei mit
>
> #include "global.h"
>
> short gobale_start=0;
Die zweite Zeile ist überflüssig, wenn Du den Preprocessor-Trick mit
"EXT" verwendest.
Aber noch zur Initialisierung: Globale Variablen sind sowieso mit 0
initialisiert. Hier kannst Du die Zuweisung mit 0 weglassen. Wenn Du
tatsächlich einen abweichenden Initialwert verwenden willst, dann musst
Du die Preprocessor-Makros erweitern, nämlich:
1 | #ifdef MAIN
|
2 | #define EXT
|
3 | #define E_INIT(x) = (x)
|
4 | #else
|
5 | #define EXT extern
|
6 | #define E_INIT(x)
|
7 | #endif
|
8 |
|
9 | EXT short gobale_start E_INIT(123);
|
Die Ersetzung der Makros "im Kopf" überlasse ich jetzt mal Dir.
ABER:
Der EXT-Trick ist ziemlich schmutzig und ist nur für ganz faule, aber
fortgeschrittene Programmierer gedacht. Der Vorteil ist hier, dass man
sowohl für Definition und Deklaration nur eine Zeile braucht.
Klassisch macht man das so:
global.h:
1 | extern short globale_start; // Deklaration
|
main.c:
1 | #include "global.h"
|
2 | short globale_start = 0; // Definition
|
alle_anderen.c:
Die Makros fallen hier weg, man muss aber alle Variablen doppelt
angeben, sowohl einmal als Definition und einmal als Deklaration.
Ich empfehle Dir gerade als Anfänger den klassischen Weg. Das andere ist
für Fortgeschrittene, die genau wissen, was da passiert.