Globale Variablendeklaration in Header File



  • Hallo C++ Profis,

    ich habe ein eigentlich triviales Problem das mich aber derzeit schier zum verzweifeln bringt.

    In einem Projekt habe ich folgendes Konstrukt in einer Header-Datei gefunden

    /* Definition of variable */
    int i = 0xDEADBEEF;
    /* Declaration of variable */
    extern int i;
    

    Das Header File wird dann in unterschiedlichen source files inkludiert und auf i zugegriffen ohne das der Linker schreit.

    Bilde ich dieses Konstrukt jetzt aber in meinem Projekt nach, schreit der Linker das dass Symbol i mehrfach definiert ist.

    Wo liegt der Trick das man eine Variable innerhalb einer Header Datei definieren, als extern deklarieren und überall dort verwenden kann, wo man die Header Datei einbindet?

    Danke schon mal und Grüße



  • Du hast in dem header mit sicherheit nicht exakt dieses Konstrukt gefunden. Vielleicht wars mit #ifdef & Co garniert?



  • Hallo habe das Problem jetzt erkannt, ging (natürlich) über den Präprozessor, ist bei der größe des Projekts nur etwas untergegangen:

    #ifdef MACRO
    int i = 0xDEADBEEF
    #undef MACRO
    #else
    extern int i;
    #endif



  • Also ich würd im Header lieber nur die extern Deklaration haben und die Definition dann einfach direkt in die .cpp packen...



  • Defqon schrieb:

    /* Definition of variable */
    int i = 0xDEADBEEF;
    /* Declaration of variable */
    extern int i;
    

    [...]
    Bilde ich dieses Konstrukt jetzt aber in meinem Projekt nach, schreit der Linker das dass Symbol i mehrfach definiert ist.

    Richtig so. Ist ja auch Blödsinn, sowas.

    Defqon schrieb:

    Wo liegt der Trick das man eine Variable innerhalb einer Header Datei definieren, als extern deklarieren und überall dort verwenden kann, wo man die Header Datei einbindet?

    🙄

    Recherchiere
    - ODR (Eine-Definition-Regel)
    - translation unit (Übersetzungseinheit)
    - Linkage (Bindung)

    int i = 0xDEADBEEF; // DEFINiert i mit EXTERNER Bindung
    extern int i;       // DEKLARAtion von i mit EXTERNER Bindung
    

    Die zweite Zeile ist hier überflüssig. Sie verrät dem Compiler nichts neues. Er kennt i schon und weiß auch, dass i externe Bindung hat; denn externe Bindung ist der Standard für non-const Objekte auf globaler/Namensraum-Ebene.

    Wenn es unbedingt sein muss, könnte man es so machen:

    inline int& dingens_bummens_() {
      static int i = 42;
      return i;
    }
    namespace {
    int& i = dingens_bummens_();
    }
    


  • Defqon schrieb:

    Hallo habe das Problem jetzt erkannt, ging (natürlich) über den Präprozessor, ist bei der größe des Projekts nur etwas untergegangen:

    #ifdef MACRO
    int i = 0xDEADBEEF
    #undef MACRO
    #else
    extern int i;
    #endif

    Das bedeutet, dass in genau einer ÜE MACRO definiert wird und dadurch dort die Variable definiert wird. In allen anderen ÜEs greift das #else und i wird nur deklariert. Das #undef ist dafür da, falls in der einen ÜE der header mehrfach eingebunden wird, damit die Definition nur einmal abgefrühstückt wird.


Anmelden zum Antworten