globale statische Variablen im Header



  • Hab gerade gemerkt dass das nicht so funktioniert wie erdacht.

    In einer .cpp inkrementiere ich ein unsigned long in der anderen setz ich sie wieder auf 0.

    Weder als volatile deklarieren, noch export hat geholfen.

    Warum ist das so?

    Ich habe das Problem gelöst, indem ich der statischen Variable nen Klassen-Scope gegeben habe.


  • Mod

    rührwort schrieb:

    Warum ist das so?

    Weil du irgendetwas falsch gemacht hast. Ohne Code kann man natürlich nicht sagen, was. Es klingt verwirrend, wenn du davon sprichst, eine statische Variable aus einer anderen Übersetzungseinheit ändern zu wollen, wenn doch der ganze Punkt von static ist, dass die Variable nur in einer Übersetzungseinheit sichtbar ist. Wird solch eine Variable in einem Header definiert, dann ist das in jeder betroffenen Übersetzungeinheit eine neue Definition einer neuen statischen Variablen.

    Für Probleme mit globalen Variablen ist aber primär derjenige schuld, der sie überhaupt benutzt. Es gab offensichtlich keinen Grund für globale Variablen, wenn du es auch anders lösen konntest.



  • Der Code macht nicht schlauer.

    Ich hab ne statische globale im Header definiert, weil ich sie in verschiedenen Einheiten benutzen wollte. Ich hab sie statisch im Header initialisiert, in der a.cpp hab ich sie in einer statischen Funktion inkrementiert, inder der b.cpp habe ich sie in einer Methode wieder auf 0 gesetzt. Keine Namens Kollision, ich hab "::var" benutzt.

    Aber designmäßig hat sie tatsächlich mehr in einer Klasse gepasst, und sobald ich sie von global auf scoped geschubst hab, hat es geklappt.

    Ich hab sie static im Header definiert, weil sonst multiple Definitions dabei rauskommen können.

    Aber ich muss mir das mit der Übersetzungseinheit nochmal genauer anschauen, danke jedenfalls.



  • rührwort schrieb:

    Der Code macht nicht schlauer.

    Wenn man C++ beherrscht schon.



  • manni66 schrieb:

    rührwort schrieb:

    Der Code macht nicht schlauer.

    Wenn man C++ beherrscht schon.

    Du hast nirgendwo einen Plan, geschweigedenn einen guten Rat.



  • Und Du hast keinen Code...



  • rührwort schrieb:

    Weder als volatile deklarieren, noch export hat geholfen.

    Was soll denn "export" sein?

    Ich vermute, du suchst "extern".

    Also in der .h

    extern int sharedAcrossMyProgram;
    

    Und in der .cpp

    int sharedAcrossMyProgram = 0;
    

    Aber du handelst dir im Regelfall damit mehr Probleme ein als du löst. Daher lass es.



  • Hi,

    erstmal mußt Du verstehen, was eine Übersetzungseinheit ist.

    Jede C++- bzw. C-Quelldatei, die für Dein Projekt übersetzt wird, bildet zusammen mit allen Headern, die sie direkt oder indirekt inkludiert, eine Einheit, die vom Compiler bearbeitet wird und als Ergebnis eine Ausgabedatei (z.B. *.o oder *.obj) hat.

    Eine statische Variable, die außerhalb einer Funktion (und einer Klasse) definiert ist, ist nur innerhalb einer Übersetzungseinheit sichtbar. D.h, wenn Du eine solche Variable innerhalb einer Headerdatei definierst, gibt es für jede Übersetzungeinheit eine unabhängige Version dieser Variable.

    Daher: Definiere niemals Variablen und Funktionen (außer inline und templates) innerhalb einer Headerdatei.

    Wie geht's richtig?

    Eine Headerdatei:

    extern int meinevariable;
    

    In einer C++ Datei:

    extern int meinevariable=0; // extern kann auch weggelassen werden
    

    VG


  • Mod

    Der Vollständigkeit halber sei erwähnt, dass C++17 inline Variablen kennt. Die Aufteilung kann damit entfallen.
    Header:

    inline int meinevariable=0;
    

    Praktisch relevanter wahrscheinlich im Zusammenhang mit Konstanten:

    extern inline const char* const foo[] = { "abc", "def" };
    

Log in to reply