diferencia entre #if definido (WIN32) y #ifdef (WIN32)

116

Estoy compilando mi programa que se ejecutará en linux gcc 4.4.1 C99.

Solo estaba poniendo mis #defines para separar el código que se compilará en Windows o Linux. Sin embargo, recibí este error.

error: macro names must be identifiers.

Usando este código

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

Sin embargo, cuando cambié a esto, se solucionó el error:

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

Me preguntaba por qué recibí ese error y por qué las #defines son diferentes.

Muchas gracias,

ant2009
fuente

Respuestas:

161

Si usa la sintaxis #ifdef, elimine los corchetes.

La diferencia entre los dos es que #ifdefsolo puede usar una condición,
mientras que #if defined(NAME)puede hacer condicionales compuestas.

Por ejemplo en tu caso:

#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
fuente
2
sí, pero también puede conectar en cascada #ifdef UNIX con #ifndef WIN32 y obtener la misma flexibilidad (no tan legible, estoy de acuerdo)
jpinto3912
2
@ jpinto3912 Pero eso se pone aún más ||
peludo
Si tan solo hubieran ido #if defined(NAME)desde el principio y hubieran evitado crear una #ifdefdeclaración.
Andy
51
#ifdef FOO

y

#if defined(FOO)

son lo mismo,

pero para hacer varias cosas a la vez, puede usar definido, como

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

#ifdefcomprueba si se ha definido una macro con ese nombre, #ifevalúa la expresión y comprueba el valor verdadero

#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
fuente
13
Esto no responde a la pregunta. La pregunta pide la diferencia entre #if definedy #ifdef.
Hassan Nadeem
1
Esta es la mejor explicación de cómo #if FOO y #if definido (FOO) pueden comportarse de manera diferente.
Paul Beusterien