Разница между #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
.