static Variable speichert jeder für sich selbst?



  • Moin moin!

    threading.h

    #ifndef THREADING
    #define THREADING
    
    #include <pthread.h>
    
    #include "soundcheck.h"
    
    namespace threads
    {
    	static pthread_cond_t ct_todolist_newinfo = PTHREAD_COND_INITIALIZER;
    //[...]
    }
    #endif
    

    threading.cxx

    #include "threading.h"
    //[...]
    

    soundcheck.cxx

    #include "threading.h"
    //[...]
    

    Wenn ich jetzt aus threading.cxx und soundcheck.cxx auf diese Variable (&threads::ct_todolist_newinfo) zugreife, sieht es ganz so aus als gäbe es zwei unterschiedlich Variablen (genauer: Zwei unterschiedliche Werte). Ganz genau das, was ich nicht will 😞 Was mache ich falsch?

    gruß trigger



  • 'static' bedeutet ja, daß es pro Übersetzungseinheit eine eigene Instanz gibt.

    Leg einfach eine normale Variable in threading.cxx an und in der Header-Datei dann eine entsprechende 'extern'-Deklaration.

    threading.cxx:

    #include "threading.h"
    
    pthread_cond_t threads::ct_todolist_newinfo = PTHREAD_COND_INITIALIZER;
    

    threading.h:

    namespace threads
    {
        extern pthread_cond_t ct_todolist_newinfo;
    //[...]
    }
    


  • Vielen vielen Dank! Funktioniert jetzt!



  • Trigger_Hurt schrieb:

    Was mache ich falsch?

    Du hast hier "static" falsch benutzt. "static" hat zwei unterschiedliche Bedeutungen (genau genomen sogar 3), je nach Kontext. Der eigentliche Sinn von "static" ist es, einem Objekt im statischen Speicher anzulegen (static life-time). Variablen/Objekte auf Namensraumebene haben aber sowieso schon diese Eigenschaft. Hier hat man "static" dazu missbraucht, um "Bindung" (linkage) zu kontrollieren. Du kannst Objekte und Funktionen mit interner und externer Bindung deklarieren. Du willst offensichtlich bei dem Objekt externe Bindung haben, benutzt aber fälschlicherweise "static", was dazu führt, dass das Objekt eine interne Bindung besitzt.

    "static" auf globaler/Namensraum- Ebene ist übrigens in C++ verpönt. Ich glaube, es ist sogar offiziell "deprecated". In C++ haben wir anonyme Namensräume. Sie haben fast debselben Effekt, nämlich, dass Du aus einer anderen Übersetzungseinheit solche Funktionen oder Objekte nicht direkt ansprechen kannst. Die Bindung wird dabei nicht beeinflusst.

    kk


Anmelden zum Antworten