使用编译器指令时,我不清楚以下两个代码片段中的哪一个是正确/首选的,为什么。似乎我见过的大多数开发人员和开源项目都使用了第一个,但我也看到了第二个经常使用的项目。
#ifdef DEBUG
[self doSomethingOnlyWhenDebugging];
#endif
VERSUS
#if DEBUG
[self doSomethingOnlyWhenDebugging];
#endif
以上哪些代码段仅适用于在调试时运行代码以及为什么?我的猜测是,如果将DEBUG定义为TRUE或FALSE,则第一个将运行,其中第二个将仅在定义DEBUG并设置为TRUE时运行。这是对的吗?
答案 0 :(得分:38)
你是对的。 #if DEBUG
无法评估DEBUG
是否定义为0
。
至于何时使用每个,如果存在预处理器定义(例如添加调试日志记录),您可以坚持使用#ifdef
来只需要添加代码。如果您需要检查值并按下不同的编译路径,那么我将使用0
或1
。一个很好的例子是TARGET_IPHONE_SIMULATOR
,它总是为iOS项目定义,但如果你正在为模拟器进行编译,则只有1
。
答案 1 :(得分:7)
据我所知,最好的选择是:
#ifndef DEBUG
NSLog(@"-1");
#elif DEBUG == 0
NSLog(@"0");
#else
NSLog(@"%d", DEBUG);
#endif
然后,您会知道 #ifndef DEBUG
比其他所有人更受欢迎。
有一个更简单的选择:
#if DEBUG == 0 // DEBUG is not defined or defined to be 0
// do sth
#else
// do sth
#endif
但是,如果启用了 -Wundef 编译器标记,则#if DEBUG == 0
可能会出现警告。
答案 2 :(得分:2)
您需要查看定义或未定义DEBUG的代码,并相应地编写代码。使用DEBUG,您会发现它未定义或定义为值为1.因此,#if
DEBUG或#ifdef
DEBUG将起作用。
对于您所控制的#define
,我建议您始终使用值0或1来定义它们。然后,您可以使用#if
来检查值,但是您也可以直接在普通的if语句或表达式中使用它们,这可能会使您的代码更具可读性。由于它始终定义,您可以使用Xcode中的“跳转到定义”来转到定义它的位置,并检查它的设置方式和原因。如果您要么#define
或者#define
值,并且未定义,那么Xcode将不知道源代码中的哪个未定义。它还为您提供了查找拼写错误的用途的机会。如果“跳转到定义”不起作用,那么您知道拼错了。
BTW在#if
指令中,任何未定义的宏都将替换为0.因此,如果未定义DEBUG,或者如果DEBUG定义为0,则#if
DEBUG将起作用,并且它将如果DEBUG被定义为什么都没有编译 - 这会告诉你什么是错的,所以你可以解决它。从这个角度来看,除非不编译,否则使用#if
会更好。