在使用编译器指令时,我不清楚下面两个代码片段中的哪一个是正确的/首选的,以及为什么。似乎我见过的大多数开发人员和开源项目都使用第一个,但我也看到第二个经常使用。
#ifdef DEBUG
[self doSomethingOnlyWhenDebugging];
#endif对比
#if DEBUG
[self doSomethingOnlyWhenDebugging];
#endif对于仅在调试时运行代码而言,上述代码片段中的哪一个更可取?为什么?我的猜测是,如果DEBUG被定义为TRUE或FALSE,则第一个将运行,而第二个将仅在DEBUG被定义并设置为TRUE时运行。对吗?
发布于 2013-04-27 05:43:10
你是对的。如果DEBUG被定义为0,#if DEBUG将不会进行评估。
至于何时使用每个预处理器,如果只需要在预处理器定义存在的情况下添加代码,如添加调试日志,则可以坚持使用#ifdef。如果您需要检查该值并沿着不同的编译路径运行,那么我将使用0或1。一个很好的例子是TARGET_IPHONE_SIMULATOR,它总是为iOS项目定义的,但只有在为模拟器编译时才定义1。
发布于 2014-02-14 17:29:46
据我所知,最好的选择是:
#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编译器标志为on,则可能会出现警告 with #if DEBUG == 0。
发布于 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更好,除非它不能编译。
https://stackoverflow.com/questions/16245633
复制相似问题