webForumDet fria alternativet

#define g.år inte att använda i switch/case & if-satser?

C/C++

2 svar · 1 107 visningar · startad av Steady

Medlem sedan dec. 2004225 inlägg
Frågan#1

Hej!
Sjukt länge sen man hängde på det här forumet, gillar att ni inte bytt färgtema än, känner sig fortfarande hemma :D

Har ett problem med en gnutta kod. Jag är helt ny på C++, har gjort en del i C och C# innan, men främst PHP och Java.
Anyhow, here's the deal:

Jag har skapat några fördefinerade rader som ser ut såhär:

#define APP_STATE_IDLE 0;
#define APP_STATE_SCANNED 1;
#define APP_STATE_ANIMATE 2;
#define APP_STATE_COMPLETE 3;

Problemet är nu när jag försöker använda dessa så går det inte att använda dem i t.ex. case och if-satser, typ såhär:

switch (APP_STATE) {
	case APP_STATE_IDLE: // <-- ger felmeddelande "Expected ':' before ';' token"
		cout <<	"idle" << endl;
		APP_STATE = APP_STATE_SCANNED; // <-- ger inget felmeddelande
		break;
	default:
		break;
}

Hur kommer sig detta? Det blir samma fel när jag skriver

if (APP_STATE > APP_STATE_SCANNED) {

}

Hoppas någon kan "shed some light" på det här, för jag är clueless.

Tack!

Medlem sedan aug. 20039 340 inlägg
#2

#define är inte en del av språket C/C++, utan hanteras av den så kallade preprocessorn innan koden kompileras. Vad #define gör är enkel sträng-ersättning. T ex ber du preprocessorn ersätta alla förekomster av APP_STATE_IDLE med 0;
Alltså ser kompilatorn case 0;: som är fel av uppenbara skäl.

Av samma anledning bör du använda parenteser både runt in-argumenten och hela uttrycket om du använder någon operator i definitionen:

Fel
#define multiply( n1,n2 ) n1*n2

x=2/sum(5+8, 3+6);
-> x=2/5+8*3+6;

Rätt
#define multiply( n1,n2 ) ( (n1)*(n2) )

x=2/sum(5+8, 3+6);
-> x=2/( (5+8)*(3+6) );
Medlem sedan dec. 2004225 inlägg
#3

. (y)

Tusen tack, det låter mer logiskt, vet inte riktigt hur jag tänkte när jag skrev semikolon efter varje rad.

250 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)
118 ms — ändringar (db)