#ifdef DEBUG与#if DEBUG

时间:2013-04-26 21:39:12

标签: ios objective-c xcode

使用编译器指令时,我不清楚以下两个代码片段中的哪一个是正确/首选的,为什么。似乎我见过的大多数开发人员和开源项目都使用了第一个,但我也看到了第二个经常使用的项目。

#ifdef DEBUG
[self doSomethingOnlyWhenDebugging];
#endif

VERSUS

#if DEBUG
[self doSomethingOnlyWhenDebugging];
#endif

以上哪些代码段仅适用于在调试时运行代码以及为什么?我的猜测是,如果将DEBUG定义为TRUE或FALSE,则第一个将运行,其中第二个将仅在定义DEBUG并设置为TRUE时运行。这是对的吗?

3 个答案:

答案 0 :(得分:38)

你是对的。 #if DEBUG无法评估DEBUG是否定义为0

至于何时使用每个,如果存在预处理器定义(例如添加调试日志记录),您可以坚持使用#ifdef来只需要添加代码。如果您需要检查值并按下不同的编译路径,那么我将使用01。一个很好的例子是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会更好。