#if定义(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
我只是想知道为什么我得到这个错误,为什么#定义是不同的?
非常感谢,
如果使用#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
检查是否定义了该名称的macros, #if
计算expression式并检查真值
#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
尝试用#else
replace#elif
,因为我认为#elif
只有#if
而不是#ifdef
。