是“如果预处理器宏”;“运行”#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上,这可能没有什么区别,但有一天您可能希望在不同的环境中编译代码。