разница между #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 разные?

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

Ответы:


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

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.