2015-11-07 32 views
1

如果我创建一个项目的目标与价值1Debug配置命名DEBUG预处理宏,而不是为Release配置,我发现,使用#if预处理宏是否正在运行#ifdef在Objective-C的幕后?

#if DEBUG 
... 
#endif 

编译为Release建立了。

首先,检查DEBUG是否定义以及是否在之后,如果它评估为true?如果是,是否可以(或建议)以这种方式使用它而不是

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

+0

'#if DEBUG'只应该是'DEBUG'被定义并且它有一个非零值。 – rmaddy

回答

1

不建议使用#if VARIABLE而不检查已定义VARIABLE

#if计算表达式,它执行以下操作:(这意味着其尚未#define d的符号将保持不变)

  1. 它扩展在表达的所有宏

  2. 它解析结果作为一个整数算术表达式中,用整数0

所以更换任何标识符如果DEBUG尚未#define d为宏,

#if DEBUG 

将相同

#if 0 

其也将具有#ifdef DEBUG相同的效果。

如果定义DEBUG-DDEBUG命令行,然后有一个隐含的

#define DEBUG 1 

之前的文件进行预处理,其结果是

#if DEBUG 

相同

#if 1 

这也与相同。

但是。如果你做了以下内容:

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

的该#if将扩大到:

#if 

,你会得到一个错误信息:

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

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

+0

哇,非常感谢您的详细解答!但是,正如@Jody Hagins提到的那样,默认情况下,Xcode为'Debug'配置提供了预处理器宏DEBUG = 1,而'Release configuration'则没有。那么,对于这种情况,使用'#if DEBUG'而不是'#ifdef DEBUG'仍然是错误的吗? –

+0

@IulianOnofrei:总的来说,最好使用'#ifdef DEBUG'。在XCode上它可能没有什么区别,但总有一天你可能想在不同的环境下编译代码。 – rici

1

当在调试模式下构建时,Modern Xcode已经为DEBUG提供了一个定义。

enter image description here

#ifdef DEBUG#if DEBUG之间的区别是,当符号被定义,不管已经定义了什么价值#ifdef DEBUG将是真实的。

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

但是,#if DEBUG只有在DEBUG已定义为非零值时才为真。

+0

我想说的是,但我不确定它是否确实是默认行为,或者项目上的以前的开发人员添加了它。 –

+0

所以简短的答案是'是',它确实检查宏是否已定义,如果没有像我想的那样定义它,它不会崩溃构建,对吧? –

+0

'#if DEBUG'只会在'DEBUG'没有定义或者其值为零时返回'false'。如果没有定义,它不会崩溃。 – rmaddy