c: extern und static?

... komplette Frage anzeigen

2 Antworten

Ich beschreibe hier nur globale Variablen (außerhalb einer Funktion):

"Externe Bindung" heißt, dass die Variable namentlich in der compilierten Objektdatei (.o oder .obj) gelistet wird. Der Linker kann dann Referenzen darauf aus anderen Objektdateien auflösen.
Bei "interner Bindung" bleibt die Variable für den Linker unsichtbar.

Mit Initialisierung wird die Variable immer definiert. Das darf in einer Übersetzungseinheit höchstens einmal vorkommen:

static int abc = 0; /* interne Bindung */
extern int abc = 0; /* externe Bindung */
int abc = 0; /* dasselbe wie 'extern' */

Ohne Initialisierung hat man erst mal nur eine Deklaration. Das darf durchaus mehrfach in einer Übersetzungseinheit vorkommen. Wenn daneben keine explizite Definition mit Initialisierung auftaucht, wird implizit mit 0 initialisiert — außer wenn extern dabeisteht oder die Variable nicht benutzt wird:

static int abc; /* interne Bindung, vorläufige Definition */
extern int abc; /* externe Bindung ohne Definition */
int abc; /* externe Bindung, vorläufige Definition */

Beispiel:

In abc.c wird eine externe Variable abc definiert. Hier ist extern unnötig.

Um nun diese Variable auch in anderen Übersetzungseinheiten benutzen zu können, muss man sie in abc.h unbedingt mit extern deklarieren. Denn sonst wird überall, wo abc.h inkludiert wird, eine weitere Kopie dieser Variable erzeugt. Dann meckert der Linker über die Dubletten.

Antwort bewerten Vielen Dank für Deine Bewertung

Mit extern wird eine Variable deklariert, du sagst dem Compiler einfach nur irgendwo in einem anderen Sourcefile steht eine Variable mit dem Namen und er soll diese verwenden.

Wenn du zB:

extern int i; schreibst bedeutet das irgendwo ist i definiert und der Compiler soll dieses i verwenden.

Wenn du:

int i; schreibst definierst du ein i und der Compiler verwendet dieses i.

Wenn du im globalen Space in zwei unterscheidlichen sourcefiles schreibst int i; dann hast du zwei Variablen mit dem selben Namen und einen Fehler.

Wenn du static int i; schreibst bedeutet dass das i nur in diesem einen Quelltext gültig sein soll, du kannst also in zwei unterschiedlichen Quelltexten static int i; schreiben und diese beiden Variablen sind getrennt.

Das gilt aber nur wenn du static im globalen Kontext verwendest, es gibt noch ein paar andere eigenschaften von static.

Wenn du in einer Funktion eine Variable als static definierst, dann bleibt die Varliable nach einem funktionsaufruf erhalten:

ZB die Funktion

int add()

{

       int i = 0;

       i++;

       return i;

}

Wird immer 1 zurückgeben, die Funktion

int add()

{

       static int i = 0;

       i++;

       return i;

}

gibt beim ersten Aufruf 1 zurück beim zweiten 2 usw.

Außerdem musst du noch beachten dass static Variablen vom Compiler per default mit 0 initialisiert werden, außer du gibst einen expliziten Initialisierungswert an. Bei sogenannten automatic Variablen also int i; zB musst du dich selbst um die Initialisierung kümmern.

Antwort bewerten Vielen Dank für Deine Bewertung