是“如果预处理器宏”;“运行”#ifdef在Objective-C中的幕后?

是“如果预处理器宏”;“运行”#ifdef在Objective-C中的幕后?,objective-c,macros,c-preprocessor,Objective C,Macros,C Preprocessor,如果我为值为1的项目目标的DEBUG配置创建名为DEBUG的预处理器宏,而不是为Release配置创建,我发现使用 #if DEBUG ... #endif 也为版本编译版本 首先,检查是否定义了DEBUG,以及之后是否计算为true?如果是,是否可以(或建议)以这种方式使用它而不是 #ifdef DEBUG #if DEBUG ... #endif #endif 现代Xcode已经为在调试模式下构建时的调试提供了定义 #ifdef DEBUG和#if DEBUG之

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

#if DEBUG
...
#endif
也为
版本编译
版本

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

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

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

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

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


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

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

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

#define DEBUG
#if DEBUG
//  ... stuff
#endif
  • 它展开表达式中的所有宏(这意味着未定义的符号将保持不变。)

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

  • 因此,如果
    DEBUG
    未被
    #定义
    d为宏

    #if DEBUG
    
    将与

    #if 0
    
    #if 1
    
    这也将具有与
    #ifdef DEBUG
    相同的效果

    如果在命令行上使用
    -DDEBUG
    定义
    DEBUG
    ,则存在一个隐式

    #define DEBUG 1
    
    在对文件进行预处理之前

    #if DEBUG
    

    #if 0
    
    #if 1
    
    这也与
    #ifdef DEBUG
    相同

    但是。如果您执行了以下操作:

    #define DEBUG
    #if DEBUG
    //  ... stuff
    #endif
    
    #if
    将扩展到:

    #if
    
    您将收到一条错误消息:

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

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

    \if DEBUG
    应该只对
    DEBUG
    为真,并且它有一个非零值。我想说的是,但我不确定它是否确实是默认行为,还是项目上的前开发人员添加了它。因此简短的回答是
    Yes
    ,它会检查宏是否已定义,如果没有像我想的那样定义宏,它不会使构建崩溃,对吗?
    \if DEBUG
    将只返回
    false
    ,如果
    DEBUG
    未定义或其值为零。如果没有定义,它不会崩溃。哇,非常感谢你的详细回答!但是,正如@Jody Hagins提到的,Xcode默认情况下为
    DEBUG
    配置提供预处理器宏
    DEBUG=1
    ,而为
    发布配置提供无。因此,在这种情况下,使用
    #if DEBUG
    而不是
    #ifdef DEBUG
    是否仍然是错误的?@IulianOnofrei:总体而言,使用
    #ifdef DEBUG
    更好。在XCode上,这可能没有什么区别,但有一天您可能希望在不同的环境中编译代码。