разница между #if определена (WIN32) и #ifdef (WIN32) - PullRequest
92 голосов
/ 11 ноября 2009

Я компилирую свою программу, которая будет работать на 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 отличаются?

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

Ответы [ 3 ]

138 голосов
/ 11 ноября 2009

Если вы используете синтаксис #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
40 голосов
/ 20 октября 2012
#ifdef FOO

и

#if defined(FOO)

одинаковы,

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

#if defined(FOO) || defined(BAR)
19 голосов
/ 11 ноября 2009

#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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...