2009-11-11 22 views
76

Estoy compilando mi programa que se ejecutará en linux gcc 4.4.1 C99.diferencia entre #if defined (WIN32) y #ifdef (WIN32)

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

error: macro names must be identifiers. 

Utilizando este código

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

Sin embargo, cuando cambié a este error se fijó:

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

Me preguntaba por qué tengo ese error y por qué el #defines ¿son diferentes?

Muchas gracias,

Respuesta

112

Si utiliza la sintaxis #ifdef, eliminar los corchetes.

La diferencia entre los dos es que #ifdef sólo se puede utilizar una sola condición,
mientras #if defined(NAME) puede hacer condicionales compuestas.

Por ejemplo, en su 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 
+2

sí, pero también podría poner en cascada #ifdef UNIX con #ifndef WIN32, y obtener la misma flexibilidad (no tan legible, estoy de acuerdo) – jpinto3912

+1

@ jpinto3912 Pero eso se pone aún más peludo con '||' – Aidiakapi

+0

Si tan solo hubieran tenido ido con '#if defined (NAME)' desde el principio y evitó crear una declaración '# ifdef'. – Andy

21

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

no estoy seguro de por qué esto tiene 2 votos a favor inexplicables – artm

+1

Esto no responde la pregunta. La pregunta pregunta por la diferencia entre '#if defined' y' # ifdef'. –

32
#ifdef FOO 

y

#if defined(FOO) 

son los mismos,

pero para hacer varias cosas a la vez, se puede utilizar definida, como

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

Trate de reemplazar #elif con #else, ya que creo #elif solamente se acompaña con #if y no con #ifdef .

+1

notificado, no es cierto – IceFire