iOS 中#define和预编译指令

在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这个关键字系统已经用了,咱们就不要抢了,抢的话也会提示重复定义..编译

相关文章
相关标签/搜索