unterschied globale variablen, statisch variablen



  • Kann mir jeamnd genau sagen worin der unterschied zwischen global speicherklassen und static liegt???
    gruß miriam



  • Globale Variablen können von überall im Programm angesprochen werden. Statische Variablen sind nur in ihrer definierten Umgebung gültig.



  • man definirt doch manchmal aber auch staic variablen direkt nach den Präprozesseranweisungen!! Dann wären sie ja gleich wie normale globale variablen



  • miriam.F schrieb:

    man definirt doch manchmal aber auch staic variablen direkt nach den Präprozesseranweisungen!! Dann wären sie ja gleich wie normale globale variablen

    Wenn man statische Variablen definiert, besteht dennoch ein Unterschied zu globalen Variablen. Globale Variablen haben eine globale Sichtbarkeit, wohin gegen statischen Variablen in einem Kontext stehen.

    // Header
    class A
    {
        private:
            static int count;
        //...
    }
    
    // Source
    #include "A.h"
    
    int A::count = 0;
    //...
    

    Statische Variablen werden ggf. auch erst mit den ersten Zugriff angelegt, globale (in undefinierter bzw. compilerabhängiger Reihenfolge). Globale Variablen sollte man auch tunlichst vermeiden, es gibt nur sehr wenige Ausnahmen wo es vielleicht Sinn machen kann.

    Und in meinen Besipiel definierst du zwar die statische Variable, aber sie ist dennoch ein privates Element der Klasse.

    cu André



  • asc schrieb:

    Und in meinen Besipiel definierst du zwar die statische Variable, aber sie ist dennoch ein privates Element der Klasse.

    cu André

    In deinem Beispiel dürfte das untere "static" ein Fehler sein.

    @Miriam: Wenn du auf globaler Ebene eine static Variable anlegst, wird diese nur der betroffenen Übersetzungseinheit verwendbar. Eine "normale" globale Variable ist von überall erreichbar:

    //functions.cpp
    #include "functions.h"
    static int si;
    int gi;
    ...
    
    //main.cpp
    #include "functions.h"
    extern int gi;//wird vom Linker mit der obigen 'int gi;' verknüpft
    extern int si;//Fehler - undefined external
    ...
    

    (in C++ gibt es bessere Wege, Daten zu kapseln, aber in C sind statische Variablen ein guter Weg, Informationen zwischen verschiedenen Funktionen auszutauschen (z.B. srand() und rand()))



  • das schlüsselwort static hat merere bedeutungen in c++:

    1. static auf Dateiebene:

    int a; // globale Variable sichtbar überall
    static int b; // globale Variable nur sichtbar in dieser Datei

    2 static in der function

    void myFunc()
    {
    static int a; // static locale Variable behält ihren Wert auch bei mehrmaligen aufruff
    int b; // locale Variable bei jedem function's aufruff neu allokiert und initialisiert
    }

    3 static in der Klassen

    class A
    {
    static int a; // mehrere instancen der Klasse A greifen auf die selbe Variable a zu
    };



  • CStoll schrieb:

    In deinem Beispiel dürfte das untere "static" ein Fehler sein.

    Stimmt, Relikt aus einem nicht-standardkonformen Compiler den ich verwende.
    Ist korrigiert.

    cu André


Anmelden zum Antworten