diferença entre #if definido (WIN32) e #ifdef (WIN32)


116

Estou compilando meu programa que rodará em linux gcc 4.4.1 C99.

Eu estava apenas colocando meu #defines em separar o código que será compilado no Windows ou Linux. No entanto, recebi este erro.

error: macro names must be identifiers.

Usando este código

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

No entanto, quando mudei para este, o erro foi corrigido:

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

Eu só estava me perguntando por que recebi esse erro e por que os #defines são diferentes?

Muito Obrigado,

Respostas:


161

Se você usar a sintaxe #ifdef, remova os colchetes.

A diferença entre os dois é que #ifdefsó pode usar uma única condição,
enquanto #if defined(NAME)pode fazer condicionais compostos.

Por exemplo, no seu 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
sim, mas você também pode cascatear #ifdef UNIX com #ifndef WIN32 e obter a mesma flexibilidade (não tão legível, eu concordo)
jpinto3912

2
@ jpinto3912 Mas isso fica ainda mais complicado com||
Aidiakapi

Se ao menos eles tivessem seguido #if defined(NAME)desde o início e evitado criar uma #ifdefdeclaração.
Andy

52
#ifdef FOO

e

#if defined(FOO)

são os mesmos,

mas para fazer várias coisas ao mesmo tempo, você pode usar definido, como

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

28

#ifdefverifica se uma macro com esse nome foi definida, #ifavalia a expressão e verifica se há um valor verdadeiro

#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
Isso não responde à pergunta. A questão pede diferença entre #if definede #ifdef.
Hassan Nadeem

1
Esta é a melhor explicação de como #if FOO e #if definido (FOO) podem se comportar de maneira diferente.
Paul Beusterien
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.