【问题标题】:#ifdef DEBUG versus #if DEBUG#ifdef DEBUG 与 #if DEBUG
【发布时间】:2013-04-26 21:39:11
【问题描述】:

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

#ifdef DEBUG
[self doSomethingOnlyWhenDebugging];
#endif

对比

#if DEBUG
[self doSomethingOnlyWhenDebugging];
#endif

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

【问题讨论】:

  • #ifdef 只是测试符号是否已定义。 #if 测试符号的值。所以#define FOO 0 将使#ifdef FOO 为真,但#if FOO 为假,因为它正在做#if 0
  • 您应该尝试查找“根”定义并确定该值是 1/0 值还是存在/不存在值。弄错它们可能会产生“意想不到的”后果。

标签: ios objective-c xcode


【解决方案1】:

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

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

【讨论】:

  • 因此,如果我只想在模拟器中执行某行代码,则需要使用#if,因为无论我是否在模拟器上运行,都会定义TARGET_IPHONE_SIMULATOR。对吗?
  • 很好解释。非常感谢
【解决方案2】:

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

#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警告

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-16
      • 2012-01-25
      • 1970-01-01
      • 2012-01-05
      • 1970-01-01
      • 2010-09-13
      相关资源
      最近更新 更多