разница между #if defined (WIN32) и #ifdef (WIN32)

116

Я компилирую свою программу, которая будет работать на linux gcc 4.4.1 C99.

Я просто вставлял свои #defines, чтобы отделить код, который будет скомпилирован либо в Windows, либо в Linux. Однако я получил эту ошибку.

error: macro names must be identifiers.

Используя этот код

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

Однако когда я перешел на это, ошибка была исправлена:

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

Мне просто интересно, почему я получил эту ошибку и почему #defines разные?

Большое спасибо,

ant2009
источник

Ответы:

163

Если вы используете синтаксис #ifdef, снимите скобки.

Разница между ними в том, что #ifdefможно использовать только одно условие,
а #if defined(NAME)можно выполнять сложные условные выражения.

Например, в вашем случае:

#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
источник
2
да, но вы также можете каскадировать #ifdef UNIX с #ifndef WIN32 и получить такую ​​же гибкость (не такую ​​удобочитаемую, я согласен)
jpinto3912
2
@ jpinto3912 Но это становится еще ||
хуже
Если бы только они просто согласились с #if defined(NAME)самого начала и не сделали #ifdefзаявления.
Энди
53
#ifdef FOO

и

#if defined(FOO)

одинаковые,

но чтобы делать несколько вещей одновременно, вы можете использовать определенные, например

#if defined(FOO) || defined(BAR)
неха
источник
28

#ifdefпроверяет, определен ли макрос с таким именем, #ifоценивает выражение и проверяет истинное значение

#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
Это не отвечает на вопрос. Вопрос требует различия между #if definedи #ifdef.
Hassan
1
Это лучшее объяснение того, как #if FOO и #if defined (FOO) могут вести себя по-разному.
Paul