Globale Statische Variablen



  • Ich weiß, dass eine innerhalb einer Funktion angelegte statische Variable nützlich sein kann. In meiner aktuellen Lektüre steht aber auch, dass man statische Variablen außerhalb von Funktionen anlegen kann. Dahinter sehe ich aber keinen Sinn (oder ich hab die statischen Variablen nicht verstanden). Aber bei den folgenden Codes sehe ich keinen Unterschied zwischen den beiden Versionen. Sehe ich das richtig, dass static außerhalb einer Funktion überflüssig ist?

    int global = 10;
    
    main() {
    ...
    }
    
    static int global = 10;
    
    main() {
    ...
    }
    


  • Das Schlüsselwort static verhindert, dass die Variable global in anderen Header- bzw. Quelltextdateien les- bzw. veränderbar ist. Mit anderen Worten: sie beschränkt die Variable auf die Datei, in der sie deklariert wurde.



  • Aber die Lesbarkeit der einfachen int global ist in diesem Fall auch einzig auf die Datei beschränkt in der sie deklariert wurde, solange niemand eine extern-Version der Variable erstellt, oder?



  • Ganz genau. Aber strenggenommen sind static und extern außerhalb von Funktionen einfach Gegensätze (statisch im Sinne davon, den Wert zu behalten, sind sie sowieso beide).

    EDIT:
    "Ganz genau" ist Blödsinn. Ein einfaches "int global" außerhalb einer Funktion ist überall sichtbar.



  • bgdnoy schrieb:

    Ein einfaches "int global" außerhalb einer Funktion ist überall sichtbar.

    Aber wenn ich es in einer anderen Quelltextdatei nicht deklariere, kann ich es dort auch nicht benutzen, denn die Datei ist dann gar nicht kompilierbar.



  • Zwei Screenshots um zu zeigen was ich meinte:

    ohne extern
    http://dl.getdropbox.com/u/287249/noextern.png

    mit extern
    http://dl.getdropbox.com/u/287249/withextern.png

    Also. Wie man sieht musste ich die in der Datei main.c deklarierte int global in der datei add.h beschreiben um sie in der Datei add.c nutzen zu können. Ohne extern wie es beim ersten Screenshot der Fall ist, ist die global nur innerhalb der Datei in der sie deklariert wurde global. Zumindest was meine mageren C-Kenntnisse betrifft kann ich sie ohne extern nicht überall lesen.



  • Ok. Jetzt hab ichs. Wenn ich die int global einfach auch in den anderen Dateien deklariere, in denen ich sie nutzen möchte (also in meinem Fall in der add.c), ist sie doch dateiübergreifend global und zwar dann auch ohne extern.


Anmelden zum Antworten