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

ant*_*009 102 c

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

我只是把我的#defines放在一起分开将在windows或linux上编译的代码.但是,我收到了这个错误.

error: macro names must be identifiers.
Run Code Online (Sandbox Code Playgroud)

使用此代码

#ifdef(WIN32)
/* Do windows stuff
#elif(UNIX)
/* Do linux stuff */
#endif
Run Code Online (Sandbox Code Playgroud)

但是,当我更改为此错误时,错误已得到修复:

#if defined(WIN32)
/* Do windows stuff
#elif(UNIX)
/* Do linux stuff */
#endif
Run Code Online (Sandbox Code Playgroud)

我只是想知道为什么我得到了这个错误以及为什么#defines不同?

非常感谢,

use*_*556 149

如果使用#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
Run Code Online (Sandbox Code Playgroud)

  • 是的,但你也可以用#ifndef WIN32级联#ifdef UNIX,并获得相同的灵活性(不是可读的,我同意) (2认同)
  • @ jpinto3912但是,`||`变得更加毛茸茸 (2认同)
  • 如果他们从一开始就使用“#if Defined(NAME)”并避免创建“#ifdef”语句就好了。 (2认同)

小智 46

#ifdef FOO
Run Code Online (Sandbox Code Playgroud)

#if defined(FOO)
Run Code Online (Sandbox Code Playgroud)

是相同的,

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

#if defined(FOO) || defined(BAR)
Run Code Online (Sandbox Code Playgroud)


joh*_*nes 23

#ifdef检查是否已定义该名称的宏,#if计算表达式并检查true值

#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
Run Code Online (Sandbox Code Playgroud)

  • 这不回答这个问题.这个问题要求`#if defined`和`#ifdef`之间的区别. (12认同)
  • 这是 #if FOO 和 #if Defined(FOO) 如何表现不同的最佳解释。 (2认同)
  • 一个有用的答案,因为它显示了“#ifdef”和“#if”之间的细微差别 (2认同)