2013-04-26 92 views
41

使用编译器指令时,我不清楚以下两个代码片段中的哪一个是正确的/首选的以及为什么。看来,我见过的大多数开发人员和开源项目都使用第一个,但我也看到了第二个频繁使用的项目。#ifdef调试与#if调试

#ifdef DEBUG 
[self doSomethingOnlyWhenDebugging]; 
#endif 

VERSUS

#if DEBUG 
[self doSomethingOnlyWhenDebugging]; 
#endif 

这上面的代码片段的最好运行代码只在调试时,为什么?我的猜测是,如果DEBUG被定义为TRUE或FALSE,第一个将运行,其中第二个只有在DEBUG被定义并设置为TRUE时才会运行。那是对的吗?

+9

'#ifdef'只是测试符号是否已被定义。'#if'测试符号的VALUE。所以'#define FOO 0'将使'#ifdef FOO'为真,但'#if FOO'为假,因为它正在执行'#if 0'。 – 2013-04-26 21:43:46

+0

您应该尝试查找“根”定义并确定该值是打算成为1/0值还是当前/不存在的值。让他们错误可能会产生“意想不到的”后果。 – 2013-04-26 21:47:14

回答

35

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

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

+1

因此,如果我只想在模拟器中执行某行代码,那么我需要使用'#if',因为无论我是否在模拟器上运行,都定义了TARGET_IPHONE_SIMULATOR。正确? – lidsinker 2013-04-26 21:49:51

+2

@lidsinker正确 – Kevin 2013-04-26 21:53:48

+0

很好地解释。非常感谢 – 2014-09-09 10:49:06

6

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

#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

1

您需要查看DEBUG定义或未定义的代码,并相应地编写代码。用DEBUG,你会发现它没有定义,或者定义值为1.因此,无论是#if DEBUG还是#ifdef DEBUG都可以工作。

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

BTW在一个#if的指令,一个没有被定义为替换为0。所以#if DEBUG会工作,如果DEBUG没有定义,或者如果DEBUG被定义为0,如果DEBUG被定义,因为它不会编译任何宏什么也没有 - 这会告诉你什么是错的,所以你可以修复它。从这个角度来看,使用#if更好,除非它不编译。