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.