我正在编译将在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不同?
非常感谢,
答案 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
正确