Globale Variablen MS Compiler



  • Der Code ist so OK.
    Was erwartest du denn für ein Verhalten und was für ein Verhalten tritt ein?



  • Ev. hilft Dir dieser Anstoss weiter:

    #include <iostream>
    
    int value = 27;
    
    int main()
    {
        int value = 2;
    
        std::cout << "value = " << value << std::endl;
        std::cout << "::value = " << ::value << std::endl;
    }
    


  • Shade Of Mine schrieb:

    Der Code ist so OK.
    Was erwartest du denn für ein Verhalten und was für ein Verhalten tritt ein?

    Ich erwarte den Linkerfehler, weil die GlobalVar zweimal definiert wurde.
    Nirgends steht extern davor, um nur eine Deklaration zu haben.
    Nirgends steht static davor, um sie lokal zur Übersetzungseinheit zu machen.

    GCC sagt
    obj\Release\main.o:main.cpp:(.bss+0x0): multiple definition of `GlobalVar'



  • Shade Of Mine schrieb:

    Der Code ist so OK.
    Was erwartest du denn für ein Verhalten und was für ein Verhalten tritt ein?

    Erwartetes Verhalten:
    Spätestens der Linker wirft einen Fehler/Warnung, die sinngemäß so aussieht: "GlobalVar bereits in xyz.obj definiert". Um das zu fixen müsste dann für einen der beiden Variablen-Definitionen das Schlüsselwort "extern" verwendet werden.
    Ich weiß, die Variable ist trotzdem global, aber es wäre wenigstens mir und dem Compiler/Linker klar was ich will 🙂

    Eingetretenes Verhalten:
    Kompilieren/Linken läuft Fehler- und Warnungsfrei und die beiden Variablen GlobalVar werden zu einer globalen Variablen verschmolzen.
    Wie kann der Compiler wissen, ob ich das wirklich will?



  • volkard schrieb:

    Shade Of Mine schrieb:

    Der Code ist so OK.
    Was erwartest du denn für ein Verhalten und was für ein Verhalten tritt ein?

    Ich erwarte den Linkerfehler, weil die GlobalVar zweimal definiert wurde.
    Nirgends steht extern davor, um nur eine Deklaration zu haben.
    Nirgends steht static davor, um sie lokal zur Übersetzungseinheit zu machen.

    GCC sagt
    obj\Release\main.o:main.cpp:(.bss+0x0): multiple definition of `GlobalVar'

    👍 Exakt auf den Punkt gebracht! Genau so ein Fehler wäre vom MS-Linker wünschenswert



  • mikesc_24 schrieb:

    Wie kann der Compiler wissen, ob ich das wirklich will?

    Kann man ihn pingeliger einstellen, Warnstufe 4 oder Linkeroptionen mitschicken oder sowas?

    Ansonsten hilft wohl nur, eine Textdatei anzulegen, in der die Namen aller globaler Variablen erfaßt und gewartet werden. löl, völlig utopisch!

    Oder wenigstens die Namen eindeutig machen.

    a) Mit UUID
    int GlobalVar_UUID14ced5f23bcf4ac1b8311eaad96ec945;
    Ja, das hat Charme einself

    b) Mit dem Dateinamen
    int Modul1_GlobalVar;

    c) Und das mache ich in Java\1:
    Mit dem Funktionsnamen
    var NTA_JumpAway_nextTime=0;



  • Viel probieren, hilft viel... 😉

    Ich habe eine gangbare Lösung gefunden:

    Weist man der globalen Variablen direkt bei der Deklaration einen Wert zu (und zwar allen), sprich definiert sie explizit, dann kommt es zu dem gewünschten Fehler (LNK2005: _GlobalVar already defined in modul2.obj und LNK1169: one or more multiply defined symbols found)

    int GlobalVar = 0;
    

    @volkard:
    Muss man das beim gcc auch tun oder nimmt der eine implizite Definition statt einer Deklaration vor ?



  • mikesc_24 schrieb:

    @volkard:
    Muss man das beim gcc auch tun oder nimmt der eine implizite Definition statt einer Deklaration vor ?

    Ich habe Deinen Code unverändert übernommen, also ohne =0 und es kam der Linkerfehler.

    Aber =0 ist eh schöner und für gcc würde ich diesen Stil auch bevorzugen.



  • volkard schrieb:

    Shade Of Mine schrieb:

    Der Code ist so OK.
    Was erwartest du denn für ein Verhalten und was für ein Verhalten tritt ein?

    Ich erwarte den Linkerfehler, weil die GlobalVar zweimal definiert wurde.

    Oh, ich mache wohl zuviel Java...
    Dachte irgendwie der int wäre nur im modul sichtbar und nicht exportiert. Aber in C++ ist ja alles visible hätte sie per unnamed namespace oder static selber wegnehmen müssen.

    mein fehler.



  • Das "Problem" haben wir mal hier vor einem Jahr besprochen: http://www.c-plusplus.net/forum/272040-full 🙂


Anmelden zum Antworten