#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 

尝试用#elsereplace#elif ,因为我认为#elif只有#if而不是#ifdef