#if 预处理器宏 "running" #ifdef 是在 Objective-C 的幕后吗?

Is #if preprocessor macro "running" #ifdef behind the scenes in Objective-C?

如果我为项目目标的 Debug 配置创建一个名为 DEBUG 的预处理器宏,值为 1,而不是 Release 配置,我发现使用

#if DEBUG
...
#endif

也为 Release 构建编译。

首先,它是否检查 DEBUG 是否已定义以及 之后是否计算为 true?如果是,是否可以(或推荐)以这种方式使用它而不是

#ifdef DEBUG
    #if DEBUG
    ...
    #endif
#endif

?

现代 Xcode 在调试模式下构建时已经提供了 DEBUG 的定义。

#ifdef DEBUG#if DEBUG 的区别在于,无论定义了什么值,定义符号时 #ifdef DEBUG 都为真。

因此,#define DEBUG=0 对于 #ifdef DEBUG 是正确的,因为它有一个定义的值(出于同样的原因,它对于 #define DEBUG 也是正确的)。

但是,只有当 DEBUG 被定义为非零值时,#if DEBUG 才会为真。

不建议在未检查 VARIABLE 已定义的情况下使用 #if VARIABLE

#if 计算表达式时,它会执行以下操作:

  1. 扩展表达式中的所有宏(这意味着未被#defined的符号将保持不变。)

  2. 它将结果解析为整数算术表达式,用整数 0 替换任何标识符。

所以如果 DEBUG 还没有 #defined 作为宏,

#if DEBUG

将与

相同
#if 0

这也与 #ifdef DEBUG 具有相同的效果。

如果你在命令行中用-DDEBUG定义DEBUG,那么就有一个隐含的

#define DEBUG 1

在文件被预处理之前,结果是

#if DEBUG

相同
#if 1

也与#ifdef DEBUG相同。

不过。如果您执行了以下操作:

#define DEBUG
#if DEBUG
//  ... stuff
#endif

#if 将扩展为:

#if

你会收到一条错误消息:

file.m:2:6: error: #if with no expression

因此,使用#if VARIABLE是不明智的,除非您确定VARIABLE已被定义为整数。