différence entre #if défini (WIN32) et #ifdef (WIN32)

116

Je compile mon programme qui fonctionnera sous linux gcc 4.4.1 C99.

Je mettais juste mes #defines pour séparer le code qui sera compilé sur Windows ou Linux. Cependant, j'ai eu cette erreur.

error: macro names must be identifiers.

Utiliser ce code

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

Cependant, lorsque je suis passé à ceci, l'erreur a été corrigée:

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

Je me demandais simplement pourquoi j'avais cette erreur et pourquoi les #defines sont différents?

Merci beaucoup,

ant2009
la source

Réponses:

161

Si vous utilisez la syntaxe #ifdef, supprimez les crochets.

La différence entre les deux est que l' #ifdefon ne peut utiliser qu'une seule condition,
tandis que#if defined(NAME) peut faire des conditions composées.

Par exemple dans votre cas:

#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
la source
2
oui, mais vous pouvez également mettre en cascade #ifdef UNIX avec #ifndef WIN32, et obtenir la même flexibilité (pas aussi lisible, je suis d'accord)
jpinto3912
2
@ jpinto3912 Mais cela devient encore plus poilu avec||
Aidiakapi
Si seulement ils étaient partis #if defined(NAME)depuis le début et évitaient de créer une #ifdefdéclaration.
Andy
52
#ifdef FOO

et

#if defined(FOO)

sont identiques,

mais pour faire plusieurs choses à la fois, vous pouvez utiliser defined, comme

#if defined(FOO) || defined(BAR)
neha
la source
28

#ifdefvérifie si une macro de ce nom a été définie, #ifévalue l'expression et vérifie une valeur vraie

#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
la source
13
Cela ne répond pas à la question. La question demande la différence entre #if definedet #ifdef.
Hassan Nadeem
1
C'est la meilleure explication de la façon dont #if FOO et #if défini (FOO) peuvent se comporter différemment.
Paul Beusterien