在iOS开发的过程当中,常常会遇到以下的代码 :ui
#ifdef DEBUG # define DLog(fmt, ...) NSLog((@"^ %s line %d " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__); #else # define DLog(...) #endif
这是一个打印语句,用于调试程序,但是#ifdef这些都是什么鬼???#ifdef就是预处理指令。debug
预处理指令以#开头,#后是关键字,#和关键字之间容许有任意个空白字符。经常使用的预处理指令:调试
# 空指令,没有任何效果 #include 包含一个源代码文件 #define 定义宏 #undef 取消定义宏 #if 若是条件为真,则编译下面的代码 #elif 若是前面的#if不为真,则编译下面的代码 #endif 结束一个#if...#elif条件编译块 #ifdef 若是已经定义了某个宏,则编译下面的代码 #ifndef 若是没有定义某个宏,则编译下面的代码 #error 中止编译并显示错误信息
如今来看上边的打印语句的意思就是若是定义了 DEBUG 这个宏的话,日志
# define DLog(fmt, ...) NSLog((@"^ %s line %d " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
这个宏定义才会有做用。但是咱们并无在工程里边提供 DEBUG 这个宏定义啊,可是程序仍是能够打印日志,这不科学啊。code
然而,打印 DEBUG的话能够获得它的值 为 1,说明是定义过的,但是在哪里定义了..开发
在 "Target > Build Settings > Preprocessor Macros > Debug" 里有一个"DEBUG=1"。get
当咱们Run, Test, Analyze时,就属于debug mode,当Profile, Archive时就属于release mode。在XCode的"Edit Scheme..."能够切换。it
能够DEBUG这个关键字系统已经用了,咱们就不要抢了,抢的话也会提示重复定义..编译