2009-11-11 25 views
76

Ich kompiliere mein Programm, das unter Linux GCC 4.4.1 C99 läuft.Unterschied zwischen #if definiert (WIN32) und #ifdef (WIN32)

Ich habe gerade meine #defines eingefügt, um den Code zu trennen, der auf Windows oder Linux kompiliert wird. Allerdings habe ich diesen Fehler bekommen.

error: macro names must be identifiers. 

Mit diesem Code

#ifdef(WIN32) 
/* Do windows stuff 
#elif(UNIX) 
/* Do linux stuff */ 
#endif 

Allerdings, wenn ich an diese der Fehler behoben wurde geändert:

#if defined(WIN32) 
/* Do windows stuff 
#elif(UNIX) 
/* Do linux stuff */ 
#endif 

ich nur mich gefragt, warum ich diesen Fehler habe und warum die #defines sind anders?

Vielen Dank,

Antwort

112

Wenn Sie #IFDEF Syntax verwenden, entfernen Sie die Klammern.

Der Unterschied zwischen den beiden ist, dass #ifdef nur eine einzige Bedingung verwenden können, während
#if defined(NAME) Verbindung conditionals tun können.

Zum Beispiel in Ihrem Fall:

#if defined(WIN32) && !defined(UNIX) 
/* Do windows stuff */ 
#elif defined(UNIX) && !defined(WIN32) 
/* Do linux stuff */ 
#else 
/* Error, both can't be defined or undefined same time */ 
#endif 
+2

ja, aber Sie könnten auch #ifdef UNIX mit #ifndef WIN32 kaskadieren und die gleiche Flexibilität (nicht so lesbar, stimme ich zu) – jpinto3912

+1

@ jpinto3912 Aber das wird noch haariger mit '||' – Aidiakapi

+0

Wenn nur sie nur hatten mit '#if defined (NAME)' von Anfang an weggegangen und vermieden haben, eine '# ifdef' Anweisung zu erstellen. – Andy

21

#ifdef prüft, ob ein Makro mit diesem Namen definiert wurde, #if den Ausdruck und die Kontrollen für einen wahren Wert ergibt

#define FOO 1 
#define BAR 0 

#ifdef FOO 
#ifdef BAR 
/* this will be compiled */ 
#endif 
#endif 

#if BAR 
/* this won't */ 
#endif 

#if FOO || BAR 
/* this will */ 
#endif 
+0

nicht sicher, warum dies 2 unerklärte downvotes – artm

+1

Dies beantwortet die Frage nicht. Die Frage fragt nach dem Unterschied zwischen "#if defined" und "# ifdef". –

32
#ifdef FOO 

und

#if defined(FOO) 

sind die gleichen,

aber mehrere Dinge auf einmal zu tun, die Sie definiert verwenden können, wie

#if defined(FOO) || defined(BAR) 
-8

Versuchen #elif mit #else ersetzen, da ich denke, #elif nur mit #if und nicht mit #ifdef begleitet .

+1

mitgeteilt, es ist nicht wahr – IceFire