#if预处理器宏是否在Objective-C的幕后“运行”#ifdef?

时间:2015-11-07 19:23:20

标签: objective-c macros c-preprocessor

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

#if DEBUG
...
#endif

也为Release版本编译。

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

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

2 个答案:

答案 0 :(得分:1)

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

enter image description here

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

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

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

答案 1 :(得分:1)

如果不检查#if VARIABLE是否已定义,建议不要使用VARIABLE

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

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

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

  3. 因此,如果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定义为整数。