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,

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

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)

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.