#ifdef DEBUG与#if DEBUG
使用编译器指令时,我不清楚下面哪两个代码片断是正确/首选的,以及为什么。 看来,我见过的大多数开发者和开源项目都使用了第一个,但是我也经常看到第二个使用的项目。
#ifdef DEBUG [self doSomethingOnlyWhenDebugging]; #endif
与
#if DEBUG [self doSomethingOnlyWhenDebugging]; #endif
上面哪个代码片段仅适用于debugging时运行代码,为什么? 我的猜测是,如果DEBUG被定义为TRUE或FALSE,第一个将运行,第二个只有在DEBUG被定义并设置为TRUE时才会运行。 那是对的吗?
你是对的。 如果DEBUG
定义为0
#if DEBUG
将不会评估。
至于什么时候使用,你可以坚持使用#ifdef
来处理任何你只需要添加代码的地方,如预处理器的定义,比如添加debugging日志。 如果您需要检查值并沿着不同的编译path,那么我会使用0
或1
。 一个很好的例子就是TARGET_IPHONE_SIMULATOR
,它总是为iOS项目定义的,但是如果你正在为模拟器编译的话,则只有1
。
据我所知,最好的select是:
#ifndef DEBUG NSLog(@"-1"); #elif DEBUG == 0 NSLog(@"0"); #else NSLog(@"%d", DEBUG); #endif
那么,你会知道#ifndef DEBUG
是首选的#ifndef DEBUG
其他。 有一个更简单的select:
#if DEBUG == 0 // DEBUG is not defined or defined to be 0 // do sth #else // do sth #endif
但是,如果-Wundef编译器标志处于打开状态,则可能会出现#if DEBUG == 0
的警告 。
您需要查看DEBUG定义或未定义的代码,并相应地编写代码。 用DEBUG,你会发现它没有被定义,或者被定义为1。所以#if
DEBUG或#ifdef
DEBUG都可以工作。
对于你所控制的#define
,我build议你总是定义它们,值为0或1.然后你可以使用#if
检查值,但你也可以直接在普通if语句或expression式,这可能会使您的代码更具可读性。 而且由于它总是被定义的,所以你可以使用Xcode中的“跳转到定义”来到它定义的地方,并检查它是如何设置的。 相反,如果你定义了#define
或者不定义这个值,那么Xcode将不知道你的源代码在哪里没有定义。 它也让你有机会寻找拼写错误的用途。 如果“跳到定义”不起作用,那么你知道你拼错了。
BTW在#if
指令中,任何未定义的macros都被replace为0.所以,如果DEBUG没有定义,或者DEBUG被定义为0,那么DEBUG将会工作,如果DEBUG被定义为什么都不会被编译 -这会告诉你什么是错的,所以你可以修复它。 从这个angular度来看,使用#if
是更好的,除非它不编译。