разница между #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 отличаются?



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

557   3  
c

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

    Ничего не найдено.