Header + 2 cpp Dateien, wie verhält sich "static foo" in der Header datei?



  • Folgende Situation:

    Header:

    #ifndef FOO
    #define FOO
    
    static std::string foo;
    #endif
    

    erste cpp included den header und setzt foo (bestätigt). Danach wird die zweite cpp aufgerufen (reihenfolge bestätigt) und diese will foo auslesen, aber foo enthält nicht den inhalt, den die erste cpp datei gesetzt hat.

    Ist das so korrekt? Ich ging davon aus, dass ne static variable in dem globalen scope ziemlich langlebig ist



  • Seikilos schrieb:

    Ist das so korrekt? Ich ging davon aus, dass ne static variable in dem globalen scope ziemlich langlebig ist

    Ja, und vor allem in jeder Übersetzungseinheit eine eigene. Du kannst in der ersten ÜE nicht auf die statischen Variablen der zweiten ÜE zugreifen. Deshalb wird in der zweiten CPP nie ankommen, was du in der ersten in foo schreibst.



  • Lösung: extern std::string foo; im Header, std::string foo; in der Implementierungsdatei.


  • Mod

    Oder eine andere Möglichkeit, die auch Übersetzungseinheitübergreifend funktioniert:

    static string& foo(){static string intern=""; return intern;}
    

    Vorteil: Keinerlei Sorgen mehr, ob, wann und wo die statische Variable definiert wird.
    Nachteil: Ungewöhnliche Benutzung, da du immer foo() schreiben musst.



  • Das mit der Methode funktiniert bei mir nicht.
    Ich hab mal die variable in ein

    #include <string>
    class GlobalData
    {
    public:
       static std::string mapPath;
    };
    

    Gepackt, bekomme aber in den cpps wo das genutzt wird einen Linker fehler, das basic_traits nicht aufgelöst ist (LNK2001)
    Warum ist es nicht aufgelöst? Muss es noch irgendwo initialisiert werden?

    Edit: Schon gut, hab mir die Frage selber beantwortet 🙂


Anmelden zum Antworten