Globale Variablen MS Compiler
-
theta schrieb:
Hat jemand eine Idee, wie man dem das abgewöhnen kann, weil bei etwas größeren Projekten wie dem o.a. Code kann das ja zu sehr interessanten Effekten führen...
Wärs nicht besser Dir das verwenden von globalen Variablen abzugewöhnen?
Ja, da stimme ich dir zu 100% zu. Nur, wie oben schon erwähnt, geht es um ein ziemlich großes Projekt (das ich auch nicht selbst geschrieben habe), bei dem man "auf die Schnelle" nicht einfach mal alle globalen Variablen per Hand auf Sinn und Nutzen durchgehen kann. Dafür wäre es halt schön wenn man zumindest auf solche Stellen von den Tools hingewiesen werden würde.
-
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 willEingetretenes 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 einselfb) 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