首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >#ifdef DEBUG与#if DEBUG

#ifdef DEBUG与#if DEBUG
EN

Stack Overflow用户
提问于 2013-04-27 05:39:12
回答 3查看 54.3K关注 0票数 54

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

代码语言:javascript
复制
#ifdef DEBUG
[self doSomethingOnlyWhenDebugging];
#endif

对比

代码语言:javascript
复制
#if DEBUG
[self doSomethingOnlyWhenDebugging];
#endif

对于仅在调试时运行代码而言,上述代码片段中的哪一个更可取?为什么?我的猜测是,如果DEBUG被定义为TRUE或FALSE,则第一个将运行,而第二个将仅在DEBUG被定义并设置为TRUE时运行。对吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-27 05:43:10

你是对的。如果DEBUG被定义为0#if DEBUG将不会进行评估。

至于何时使用每个预处理器,如果只需要在预处理器定义存在的情况下添加代码,如添加调试日志,则可以坚持使用#ifdef。如果您需要检查该值并沿着不同的编译路径运行,那么我将使用01。一个很好的例子是TARGET_IPHONE_SIMULATOR,它总是为iOS项目定义的,但只有在为模拟器编译时才定义1

票数 41
EN

Stack Overflow用户

发布于 2014-02-14 17:29:46

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

代码语言:javascript
复制
#ifndef DEBUG
    NSLog(@"-1");
#elif DEBUG == 0
    NSLog(@"0");
#else
    NSLog(@"%d", DEBUG);
#endif

然后,您就会知道#ifndef DEBUG比其他所有工具都更受欢迎。

有一个更简单的选择:

代码语言:javascript
复制
#if DEBUG == 0 // DEBUG is not defined or defined to be 0
    // do sth
#else
    // do sth
#endif

但是,如果-Wundef编译器标志为on,则可能会出现警告 with #if DEBUG == 0

票数 8
EN

Stack Overflow用户

发布于 2015-03-26 16:35:28

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16245633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档