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

Estoy comstackndo mi progtwig que se ejecutará en linux gcc 4.4.1 C99.

Estaba poniendo mis #defines para separar el código que se comstackrá en Windows o Linux. Sin embargo, tengo este error.

error: macro names must be identifiers. 

Usando este codigo

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

Sin embargo, cuando cambié a esto el error fue corregido:

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

Me preguntaba por qué obtuve ese error y por qué los #defines son diferentes.

Muchas gracias,

Si utiliza la syntax de #ifdef, elimine los corchetes.

La diferencia entre los dos es que #ifdef solo puede usar una sola 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 
 #ifdef FOO 

y

 #if defined(FOO) 

son lo mismo,

pero para hacer varias cosas a la vez, puedes usar definidas, como

 #if defined(FOO) || defined(BAR) 

#ifdef comprueba si se ha definido una macro con ese nombre, #if evalúa la expresión y busca un 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