如果我为项目目标的DEBUG
配置创建一个名为Debug
的预处理器宏,其值为1
,而不是Release
配置,我发现使用
#if DEBUG
...
#endif
也为Release
版本编译。
首先,是检查DEBUG
是否定义,检查后是否评估为true
?如果是,是否可以(或推荐)以这种方式使用它而不是
#ifdef DEBUG
#if DEBUG
...
#endif
#endif
答案 0 :(得分:1)
现代Xcode在调试模式下构建时已经为DEBUG提供了定义。
#ifdef DEBUG
和#if DEBUG
之间的区别在于,无论定义了什么值,#ifdef DEBUG
在定义符号时都为真。
因此,#define DEBUG=0
对于#ifdef DEBUG
都是正确的,因为它有一个定义的值(出于同样的原因,#define DEBUG
也是如此)。
但是,#if DEBUG
只有在使用非零值定义DEBUG
时才会为真。
答案 1 :(得分:1)
如果不检查#if VARIABLE
是否已定义,建议不要使用VARIABLE
。
当#if
评估表达式时,它会执行以下操作:
它会扩展表达式中的所有宏(这意味着未#define
d的符号将保持不变。)
它将结果解析为整数算术表达式,用整数0替换任何标识符。
因此,如果DEBUG
未作为#define
d作为宏,
#if DEBUG
与
相同#if 0
也与#ifdef DEBUG
具有相同的效果。
如果您在命令行中使用DEBUG
定义-DDEBUG
,则会隐含
#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
定义为整数。