预编译指令
所谓预编译,就是程序代码在编译之前,开发工具为我们预先做的一些工作。不要小瞧这些指令,没有它们,我们的代码可能寸步难行。
一、文件包含相关预处理命令
#include <header>
#include "header"
C语言中使用的包含文件的指令""和<>的区别为,""是从当前目录开始寻找文件,<>是从系统库中寻找文件。这两个指令不能使头文件循环引入,也不能重复包含同一个头文件。
#import "header"
#import <header>
这两个指令和上面两个作用一样,只是更加智能,智能处理重复包含头文件的问题。
#include_next "header"
#include_next <header>
这两个指令是C中的指令,OC也支持,只是很少使用,它的作用是在找到名字匹配的头文件后跳过,寻找下一个相同名字的导入。
二、宏定义
宏定义是开发中会经常用到的一个指令了,我们还会将许多简单的函数定义为宏,省去系统压栈的时间,提高代码效率。因为这篇博客的主题是预处理命令,所以宏的用法和高级用法就不再多写了,下次再讨论。
#define 参数1 参数2
定义一个简单的替换宏,不带参数,在预编译阶段,会把所有参数1的地方直接替换为参数2。
#define ADD(x) (x+x)
定义一个带参数的宏,类似带参函数的功能,但也是编译前做简单替换。
三、条件编译
条件编译用于判断一个表达式是否成立,成立则进入条件编译。
方式一:
#if 表达式
#else
#endif
方式二:
#if 表达式
#elif 表达式
#endif
方式三:
#ifndef
如果没有定义一个宏进行编译
#ifdef
如果定义一个宏进行编译
四、错误,警告的预处理
#error 错误
当程序检查到这里时会停止编译,这个命令的作用是在错误的地方禁止编译。
#warning 警告
这个命令并不会影响程序的编译和运行,但是会认为的在这里显示一条警告信息,提醒我们自己。
五、更改文件名和行号
在OC中,有一个系统的定义的宏:
__LINE__
这个宏表示当前行的行号,可以打印。
一些常用预定义的宏
__DATE__
//进行预处理的日期(“Mmm dd yyyy”形式的字符串文字)
__FILE__
//代表当前源代码文件名的字符串文字
__LINE__
//代表当前源代码中的行号的整数常量
__TIME__
//源文件编译时间,格式微“hh:mm:ss”
__func__
//当前所在函数名
#line number
改变当前行的行号,会影响下面所有的行
#line number "filename"
改变当前行号和编译后的文件名
六、编译器控制指令
#pragma 参数
这个预编译指令是最复杂的,用于控制编译器的行为,一般我们开发应用APP是很少用到的,常用的有两种方式:
#pragma mark - 信息
为代码加上标注
#pragma message("信息")
编译时提示信息