Lebensdauer von Daten?



  • Ich habe drei Dateien:

    1. Header demo.h

    #ifndef DEMO
    #define DEMO
    short** DemoArray = NULL;
    void* create();
    #endif
    

    2. Funktion in Datei_A.cpp, die das DemoArray erzeugt und die Zeiger
    auf nur in der Datei_A bekannte Daten legt:

    #include "demo.h"
    
    static short globaleDaten[] = {5,6,7};
    
    void* create(){
    DemoArray = (short**) malloc(3,sizeof(short*));
    /* umstaendlich, damit anschaulich */
    DemoArray[0] = globaleDaten + 0;
    DemoArray[1] = globaleDaten + 1;
    DemoArray[2] = globaleDaten + 2;
    return DemoArray;
    }
    

    Und jetzt eine dritte Datei, die die Funktion void* create() aufrufen soll:

    #include "demo.h"
    int main(){
     create();
     /* usw. */
    return 0;
    }
    

    FRAGE: Habe ich jetzt mit dieser Vorgangsweise von der main-Datei aus mithilfe
    des **DemoArrays aus dem Header Zugriff auf das 'static globaleDaten[] Daten' Array aus der Datei_A.cpp, oder existiert dieses static globaleDaten[] nur fuer die Dauer, in der ich create() aufrufe? Durch das static wird doch die Lebensdauer von globaleDaten[] auf die Datei_A.cpp begrenzt? Oder bringe ich da etwas durcheinander?


  • Mod

    Ein nicht-lokales static beeinflusst nicht die Lebensdauer eines Objektes sondern nur die Sichtbarkeit des Namens. Ein solches als static deklariertes Objekt existiert für jede Übersetzungseinheit, die es deklariert, separat, während im Falle von external linakge der Name in allen Übersetzungseinheit auf ein und dasselbe Objekt verweist. Nichts daran hindert dich daran, ein in einer anderen Übersetzungseinheit definiertes static-Objekt zu benutzen, soweit dies auf anderem Wege als über dessen Namen geschieht. Im Übrigen ist

    short** DemoArray = NULL;
    

    eine Definition und darf nicht im Header erfolgen - dort sollte nur die Deklaration

    extern short** DemoArray;
    

    stehen.

    Anzumerken ist, dass static bei nicht-lokalen Bezeichnern nicht mehr erwünscht ist - unbenannte Namensräume sind eine bessere Alternative (u.a. können Zeiger auf static-Objekte nicht als Templateargumente eingesetzt werden).



  • camper schrieb:

    Ein nicht-lokales static beeinflusst nicht die Lebensdauer eines Objektes sondern nur die Sichtbarkeit des Namens. Ein solches als static deklariertes Objekt existiert für jede Übersetzungseinheit, die es deklariert, separat, während im Falle von external linakge der Name in allen Übersetzungseinheit auf ein und dasselbe Objekt verweist. Nichts daran hindert dich daran, ein in einer anderen Übersetzungseinheit definiertes static-Objekt zu benutzen, soweit dies auf anderem Wege als über dessen Namen geschieht. Im Übrigen ist

    short** DemoArray = NULL;
    

    eine Definition und darf nicht im Header erfolgen - dort sollte nur die Deklaration

    extern short** DemoArray;
    

    stehen.

    Anzumerken ist, dass static bei nicht-lokalen Bezeichnern nicht mehr erwünscht ist - unbenannte Namensräume sind eine bessere Alternative (u.a. können Zeiger auf static-Objekte nicht als Templateargumente eingesetzt werden).

    Wenn die globale Variable DemoArray im Header mit extern deklariert wird,
    dann findet der Linker von selber heraus, wo sie definiert ist? Wird durch so eine extern-Deklaration eine globale static Variable auch in anderen Quelldateien als in jener sichtbar, in der sie definiert ist? Dann könnte ich mir den Umweg mit dem indirekten Zugriff über die Zeiger womoeglich sparen?
    Mein momentanes Projekt hat sich ziemlich ausgewachsen (4000 Codezeilen in einer einzigen Quelldatei...), und jetzt versuche ich das Ding etwas zu modularisieren. Leider sind einige relativ komplexe Funktionen dabei, für die ein Satz globaler Variablen überaus wichtig ist, auf die sie alle Zugriff haben müssen. Ich kenn' mich mit Klassen leider nicht sonderlich gut aus, sonst wäre es wohl geschickter, die Variablen und Funktionen in einer Klasse zusammen zu fassen ...

    Besten Dank für den Tipp mit extern!


Anmelden zum Antworten