Разница между #if определенными (WIN32) и #ifdef (WIN32)

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

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

Ответ 1

Если вы используете синтаксиС#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 FOO

и

#if defined(FOO)

совпадают,

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

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

Ответ 3

#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

Ответ 4

Попробуйте заменить #elif на #else, так как я думаю, что #elif сопровождается только #if, а не #ifdef.