#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,那么我会使用01 。 一个很好的例子就是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是更好的,除非它不编译。