#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
计算表达式时,它会执行以下操作:
扩展表达式中的所有宏(这意味着未被#define
d的符号将保持不变。)
它将结果解析为整数算术表达式,用整数 0 替换任何标识符。
所以如果 DEBUG
还没有 #define
d 作为宏,
#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
已被定义为整数。
如果我为项目目标的 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
计算表达式时,它会执行以下操作:
扩展表达式中的所有宏(这意味着未被
#define
d的符号将保持不变。)它将结果解析为整数算术表达式,用整数 0 替换任何标识符。
所以如果 DEBUG
还没有 #define
d 作为宏,
#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
已被定义为整数。