2009-11-11 8 views
76

Je suis en train de compiler mon programme qui tournera sur linux gcc 4.4.1 C99. Je venais de mettre mes #defines pour séparer le code qui sera compilé sur Windows ou Linux. Cependant, j'ai eu cette erreur.différence entre #if defined (WIN32) et #ifdef (WIN32)

error: macro names must be identifiers. 

En utilisant ce code

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

Cependant, quand je l'ai changé à ce l'erreur a été fixé:

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

Je me demandais pourquoi je suis cette erreur et pourquoi les #defines sont différents?

Un grand merci,

Répondre

112

Si vous utilisez la syntaxe #ifdef, supprimer les crochets.

La différence entre les deux est que #ifdef ne peut utiliser une seule condition,
alors que #if defined(NAME) peut faire conditionals composés.

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

ouais, mais vous pouvez également cascader #ifdef UNIX aveC#ifndef WIN32, et obtenir la même flexibilité (pas aussi lisible, je suis d'accord) – jpinto3912

+1

@ jpinto3912 Mais ça devient encore plus poilu avec '||' – Aidiakapi

+0

Si seulement ils venaient juste parti avec '#if defined (NAME)' depuis le début et évité de créer une instruction '# ifdef'. – Andy

21

#ifdef vérifie si une macro de ce nom a été défini, #if évalue l'expression et vérifie une vraie valeur

#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

Je ne sais pas pourquoi j'ai reçu 2 downvotes inexpliquées – artm

+1

Cela ne répond pas à la question. La question demande une différence entre '#if defined' et' # ifdef'. –

32
#ifdef FOO 

et

#if defined(FOO) 

sont les mêmes,

mais de faire plusieurs choses à la fois, vous pouvez utiliser défini, comme

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

Essayez de remplacer #elif avec #else, car je pense que #elif est seulement accompagné de #if et non #ifdef .

+1

notifié, ce n'est pas vrai – IceFire