#if定义(WIN32)和#ifdef(WIN32)之间的区别

时间:2009-11-11 10:09:17

标签: c

我正在编译将在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不同?

非常感谢,

4 个答案:

答案 0 :(得分:136)

如果您使用#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

答案 1 :(得分:40)

#ifdef FOO

#if defined(FOO)

是一样的,

但要一次做几件事,你可以使用已定义的,比如

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

答案 2 :(得分:19)

#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

答案 3 :(得分:1)

#ifdef WIN32
/* Do windows stuff
#elif(UNIX)
/* Do linux stuff */
#endif

正确