正确的使用预编译宏DEBUG,它包括三个问题:
第一个问题,定义成什么?
先看DEBUG=1,DEBUG=YES,DEBUG=true,这个三个意义是一样吗?如果DEBUG宏分别定义成1、YES、true,以下代码都能输出“Hello, World”吗?
#ifdef DEBUG
NSLog(@"Hello, World! 1");
#endif
#if DEBUG
NSLog(@"Hello, World! 2");
#endif
if (DEBUG) {
NSLog(@"Hello, World! 3");
}
DEBUG=1,则1、2、3都能输出,
DEBUG=YES,则1、3能输出,2 却不能输出
DEBUG=true,则1、2、3都能输出,
YES是Objective-C语言中的BOOL值,在预编译中无法代表“真”的意思,1和true可以在预编译中代表“真”。
所以第一个问题的答案是DEBUG应该定义为是1或者true,系统默认是1。
从上面的代码的结果也引出第二个问题,如何使用DEBUG宏?
#if DEBUG 、 #ifdef DEBUG、 if (DEBUG) ,这个三种写法哪种更OK呢?
我的答案是#if DEBUG 是最好的实践,它相当于#if defined(DEBUG) && DEBUG,而#ifdef DEBUG只要定义了DEBUG就执行,不管DEBUG定义的值什么,而 if (DEBUG)在没有定义DEBUG的情况会编译不过。
第三个问题,在哪些Configuration下定义,工程默认有Debug和Release两种Configuration,那么最好的实践是在需要的Configuration中加入DEBUG宏,比如在Debug中加入DEBUG=1,千万不要在不需要的Configuration下加入,比如在Release中加入DEBUG=0就是画蛇添足了,因为代码中可能使用#ifdef DEBUG,那Release中不管DEBUG是1还是0,都会编译本来不该执行的代码。
最后,其它预编译宏的正确使用方法可以参考DEBUG宏