54

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

#ifdef DEBUG
[self doSomethingOnlyWhenDebugging];
#endif

相对

#if DEBUG
[self doSomethingOnlyWhenDebugging];
#endif

上面哪些代码片段更适合仅在调试时运行代码,为什么?我的猜测是,如果 DEBUG 被定义为 TRUE 或 FALSE,第一个将运行,而第二个将仅在 DEBUG 定义并设置为 TRUE 时运行。那是对的吗?

4

3 回答 3

42

你是对的。#if DEBUG不会评估是否DEBUG定义为0

至于何时使用每个,您可以坚持使用#ifdef任何只需要添加代码(如果存在预处理器定义)的情况,例如添加调试日志记录。如果您需要检查该值并使用不同的编译路径,那么我会使用 a01. 一个很好的例子是TARGET_IPHONE_SIMULATOR,它总是为 iOS 项目定义的,但前提1是你正在为模拟器进行编译。

于 2013-04-26T21:43:10.040 回答
8

据我所知,最好的选择是:

#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.

于 2014-02-14T09:29:45.507 回答
2

您需要查看定义或未定义 DEBUG 的代码,并相应地编写代码。使用 DEBUG,您会发现它要么未定义,要么定义为 1。因此#ifDEBUG 或#ifdefDEBUG 都可以。

对于#define受您控制的 's,我建议您始终定义它们,值为 0 或 1。然后您可以使用#if来检查值,但您也可以直接在普通 if 语句中使用它们或在一个表达式,这可能会使您的代码更具可读性。而且由于它总是被定义的,你可以在 Xcode 中使用“Jump To Definition”去定义它的地方并检查它是如何以及为什么被设置的。相反,如果您选择#define或没有#define该值,并且它没有被定义,那么 Xcode 将不知道在您的源代码中的哪个位置没有定义它。它还使您有机会查找拼写错误的用途。如果“跳转到定义”不起作用,那么你就知道你拼错了。

顺便说一句,在#if指令中,任何未定义的宏都将替换为 0。因此#if,如果未定义 DEBUG,或者将 DEBUG 定义为 0,则 DEBUG 将起作用,如果将 DEBUG 定义为空,它将不会编译 - 这会告诉你出了什么问题,所以你可以修复它。从这个角度来看,使用#if更好,除非它不编译。

于 2015-03-26T08:35:27.860 回答