Unterschied zwischen #if definiert (WIN32) und #ifdef (WIN32)

116

Ich kompiliere mein Programm, das unter Linux gcc 4.4.1 C99 ausgeführt wird.

Ich habe gerade meine #defines eingegeben, um den Code zu trennen, der unter Windows oder Linux kompiliert wird. Ich habe jedoch diesen Fehler erhalten.

error: macro names must be identifiers.

Mit diesem Code

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

Als ich dies änderte, wurde der Fehler behoben:

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

Ich habe mich nur gefragt, warum ich diesen Fehler habe und warum die #defines unterschiedlich sind.

Danke vielmals,

ant2009
quelle

Antworten:

161

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

Der Unterschied zwischen den beiden ist , dass #ifdefnur eine einzige Bedingung verwenden können,
während#if defined(NAME) zusammengesetzte Bedingungen ausgeführt werden 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
user44556
quelle
2
Ja, aber Sie könnten auch #ifdef UNIX mit #ifndef WIN32 kaskadieren und die gleiche Flexibilität erhalten (nicht so lesbar, da stimme ich zu)
jpinto3912
2
@ jpinto3912 Aber das wird noch haariger mit||
Aidiakapi
Wenn sie nur #if defined(NAME)von Anfang an mitgegangen wären und es vermieden hätten, eine #ifdefErklärung abzugeben.
Andy
51
#ifdef FOO

und

#if defined(FOO)

sind gleich,

Aber um mehrere Dinge gleichzeitig zu tun, können Sie definierte verwenden, wie z

#if defined(FOO) || defined(BAR)
neha
quelle
28

#ifdefprüft, ob ein Makro mit diesem Namen definiert wurde, #ifwertet den Ausdruck aus und prüft auf einen wahren Wert

#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
johannes
quelle
13
Dies beantwortet die Frage nicht. Die Frage fragt nach dem Unterschied zwischen #if definedund #ifdef.
Hassan Nadeem
1
Dies ist die beste Erklärung dafür, wie sich #if FOO und #if defined (FOO) unterschiedlich verhalten können.
Paul Beusterien