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

我正在编译将在 linux gcc 4.4.1 C99上运行的程序。

我只是将我的 # Definition 放入其中,以分离将在 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

我只是想知道为什么我得到了这个错误,为什么 # 定义是不同的?

非常感谢,

122636 次浏览

如果使用 # 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检查该名称的宏是否已定义,#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
#ifdef FOO

还有

#if defined(FOO)

都是一样的,

但是要同时做几件事情,你可以使用

#if defined(FOO) || defined(BAR)
#ifdef WIN32
/* Do windows stuff
#elif(UNIX)
/* Do linux stuff */
#endif

是正确的