Variablendefinition in if-Abfrage
-
Hallo Leute,
ich hab ein Problem. Und zwar moechte ich eine Variable innerhalb einer if-Abfrage definieren, nach dem Stil:
[code]if(testmode) int var; else float var;[/code]
Weiter unten im Code wird die Variable dann wieder benutzt, ob int oder float ist dabei egal. Allerdings meckert der Compiler (MV C++) dass er die Variable gar nicht kennt.
Wie bring ich ihm bei dass es das Ding auf jeden Fall geben wird???Gruss Martin
-
afaik sollte es so nicht gehen, da die variable ausserhalb ihres scopes ( also die if abfrage in deinem fall) nicht mehr existiert
-
#if testmode int var; #else float var; #endif
-
super, danke!
Gruss Martin
-
Hmm, irgendwie funktioniert das doch nicht.
Er geht IMMER in den else-Zweig, egal ob die Bedingung erfuellt ist oder nicht...
Was mache ich falsch?!?Gruss Martin
-
#define testmode 1
Sonst kommt nix bei raus -.-
-
Dann geht er aber immer in den Zweig mit "int var;".
Der Typ einer Variablen wird zur Compilezeit festgelegt und kann nicht geändert werden. Die Lösung von "fdgdfgd" wirkt zur Compilezeit, d.h. Du kannst ein Exe mit int und eins mit float bauen. Vermutlich nicht das, was Du willst.
Falls Du also zur Laufzeit den Typ wechseln willst, gibt es verschiedene Lösungen für das Problem:
- boost::any oder ähnliche Klassen, die verschiedene Typen annehmen können (Varianten)
- einfach immer ein double nehmen (da passt sowohl float als auch int rein)
- templates
-
Wenn es um eine Testmode geht denke ich mal wird er sich zu Debug-zwecken verwenden. Natürlich soll er die Präprozessor Anweisung nur einfügen wenn er sie braucht... Das ganze riecht nach Designfehler!
Noch ne möglichkeit, ist aber auch net so toll:
struct float_or_int { enum _type { INT, FLOAT } type; union { int intval; float floatval; }; float_or_int(float val) : floatval(val), type(FLOAT) { } float_or_int(int val) : intval(val), type(INT) { } float_or_int(_type __type) : type(__type) { } };
-
ach natuerlich, testmode muss ja als #define und nicht als normale Variable deklariert werden...
Danke!Gruss Martin