Globale Variablen in einer Header eingebunden in mehrere Dateien



  • Hallo,

    ich habe hier ein sehr altes Programm das hat eine Header-Datei besitzt die so aussieht:

    GlobalVars.h

    static const data1* = LoadData("file1");
    static const data2* = LoadData("file2");
    static const data3* = LoadData("file3");
    

    Diese Header-Datei wird jetzt in mehrere andere Dateien eingebunden und jedes mal wird der Code dann wieder ausgeführt. Wie kann ich es hinbekommen das alle anderen Dateien auf die gleichen Variablen zugreifen und die GlobalVars.h genau nur einmal ausgeführt wird. Ich weiß es ist alles schlechter Code und ich habe keine Ahnung wer das Programm damals geschrieben hat aber jetzt geht es darum das ganze mit so wenig Änderungen wie möglich zu beheben.

    mfg:)



  • Zum Beispiel, indem du

    #pragma once
    

    an den Anfang des Headers schreibst.

    Oder mit Include-Guards, das sieht so aus:

    #ifndef __GLOBAL_VARS_H__
    #define __GLOBAL_VARS_H__
    
    /* Inhalt deines Headers */
    
    #endif
    

    Ist die PräPro-Variable __GLOBAL_VARS_H__ nicht definiert, wird sie definiert und der Code des Headers ausgeführt. Beim nächsten Versuch ist die Variable bereits existent und der Code wird ignoriert.



  • Wenn es das ist wo du drauf hinauswillst was ich denke 😉 dann solltest du mal nach Include-Guards gucken.

    EDIT:Mist, zu langsam 😃



  • @_matze, Firefighter: Es geht hier um mehrere ÜEn, da bringen Include-Guards gar nichts.

    Peter_Hansen, ersetz den Code in der Headerdatei durch das hier:

    extern const data1*;
    extern const data2*;
    extern const data3*;
    

    Und schreib das hier in genau eine Quellcodedatei:

    const data1* = LoadData("file1");
    const data2* = LoadData("file2");
    const data3* = LoadData("file3");
    


  • Achso...gut ok dann bringt das natürlich nix was wir geschrieben haben, stimmt.



  • MFK schrieb:

    @_matze, Firefighter: Es geht hier um mehrere ÜEn, da bringen Include-Guards gar nichts.

    Peter_Hansen, ersetz den Code in der Headerdatei durch das hier:

    extern const data1*;
    extern const data2*;
    extern const data3*;
    

    Und schreib das hier in genau eine Quellcodedatei:

    const data1* = LoadData("file1");
    const data2* = LoadData("file2");
    const data3* = LoadData("file3");
    

    Vielen Dank, das ist meine Rettung:)



  • static const data1* = LoadData("file1");
    static const data2* = LoadData("file2");
    static const data3* = LoadData("file3");
    

    Könnte mir jemand erklären, was es damit auf sich hat? Seit wann darf man in C++ denn einfach die Typenangabe weglassen?



  • Nanyuki schrieb:

    Könnte mir jemand erklären, was es damit auf sich hat? Seit wann darf man in C++ denn einfach die Typenangabe weglassen?

    Seit es immer noch Compiler gibt, die ein "default-int" annehmen (ist natürlich nicht Standardkonform, und könnte auch ungewünscht sein, aber egal), auch wenn ich mir sicher bin, das dies zumindestens als Warnung ausgegeben wird (Zumindestens in der höchsten Warnstufe)...



  • asc schrieb:

    Seit es immer noch Compiler gibt, die ein "default-int" annehmen (ist natürlich nicht Standardkonform, und könnte auch ungewünscht sein, aber egal), auch wenn ich mir sicher bin, das dies zumindestens als Warnung ausgegeben wird (Zumindestens in der höchsten Warnstufe)...

    Und der Stern hinterm Bezeichner?



  • LordJaxom_lg schrieb:

    Und der Stern hinterm Bezeichner?

    Wird dann vermutlich als <default-int>* sprich int* interpretiert. Oder aber sind das unbenannte Objekte des Typs data1..data3 (Was auch ein Fehler wäre)


Log in to reply