Defines + switch() == Kaputt
-
Hallo,
folgender Schnipsel (test.cpp):
#include <iostream> #define MSG_EINS 1; #define MSG_ZWEI 2; using namespace std; int main() { int test = 2; switch (test) { case MSG_EINS: cout << "Nachricht 1\n"; break; case MSG_ZWEI: cout << "Nachricht 2\n"; break; } }Gibt das hier:
test.cpp: In function 'int main()':
test.cpp:13: error: expected:' before ';' token test.cpp:13: error: expected primary-expression before ':' token test.cpp:13: error: expected;' before ':' token
test.cpp:14: error: expected:' before ';' token test.cpp:14: error: expected primary-expression before ':' token test.cpp:14: error: expected;' before ':' tokenKompiliert ist die test.cpp unter Linux mit g++, aber ich kann mir nicht vorstellen, dass das ausschlaggebend ist.
Es kann doch nicht sein, dass #defines in einer switch()-Anweisung nicht als Bedingungen dienen können!?
Ich hoffe ihr könnt mir helfen,
lg Max
-
#define MSG_EINS 1 #define MSG_ZWEI 2
-
Deine Defines sind Kaput (Überflüssiger Strichpunkt

#include <iostream> #define MSG_EINS 1 #define MSG_ZWEI 2 using namespace std; int main() { int test = 2; switch (test) { case MSG_EINS: cout << "Nachricht 1\n"; break; case MSG_ZWEI: cout << "Nachricht 2\n"; break; } }
-
MaDsTyLe schrieb:
Es kann doch nicht sein, dass #defines in einer switch()-Anweisung nicht als Bedingungen dienen können!?
Ich hoffe ihr könnt mir helfen,
Unabhängig von drakon (richtiger) Antwort: Du solltest lieber echte Konstanten oder enums verwenden. Dies macht eine Fehlersuche auch deutlich leichter (Gründe gegen define gibt es genug, und nur wenige Stellen erfordern es wirklich. Ausnahmen sind z.B. Includeguards und bedingte Compilierung wo defines tatsächlich sinnvoll sind).
cu André
-
Oh mein Gott, ich Vollhorst...
Wie kann ein Mensch so neben sich stehen...
Neulich schreibe ich
#ifndef TEST ... #endif;und wundere mich, dass da was von tokens steht und jetzt mach ich den selben Mist nochmal ...
Vielen Dank Leute ...
Ich werde jetzt zur Geißel greifen ...
lg Max
-
mit enums siehts so aus
#include <iostream> enum Message { MSG_KEINS, MSG_EINS, MSG_ZWEI }; using namespace std; int main() { Message test(MSG_ZWEI); switch (test) { case MSG_EINS: cout << "Nachricht 1\n"; break; case MSG_ZWEI: cout << "Nachricht 2\n"; break; } }ist viel sauberer als mit #define. außerdem hast du sogar einen eigenen typ für deine nachrichten, was vieles bequemer zu programmieren macht.