разница между #if defined (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 отличаются?
большое спасибо,
3 ответов:
Если вы используете синтаксис #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
#ifdef FOOи
#if defined(FOO)же,
но чтобы сделать несколько вещей сразу, вы можете использовать определенные, как
#if defined(FOO) || defined(BAR)
#ifdefпроверяет, определен ли макрос с таким именем,#ifвычисляет выражение и проверяет значение true#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
Comments