什么是预处理指令
在C语言中对源码进行编译之前,会先对一些特殊指令作出解释,这就是C语言的编译预处理。为了区分这些指令和一般的C语句,所有预处理指令都以符号"#"开头,并且结尾不用添加分号。预处理指令可以出现在程序的任何位置,它的作用范围是从它出现的位置到文件尾,习惯上我们尽可能将预处理指令写在源程序开头。C语言中的预处理指令主要有:宏定义指令、条件编译指令、文件包含指令。
宏定义指令
#define 宏的名称 宏的值
分为有参数和无参数的,比如
#define age 10 #define sum(a,b) a+b int main(int argc, const char * argv[]) { //使用的时候直接调用 printf("%d",age); printf("%d",sum(10, 20)); printf("Hello, World!\n"); return 0; }
与函数的区别
有参数的宏定义与函数实现的功能看似差不多,但是他们之间有着本质的区别,宏定义不涉及存储空间的分配、参数类型匹配、参数传递、返回值问题,并且函数调用在程序运行时执行,而宏替换只在编译预处理阶段进行。所以带参数的宏比函数更高效。
条件编译指令
条件编译就是根据一些条件判断后选择性编译,与流程控制比较类似,比如
#define MAX 11 int main(int argc, const char * argv[]){ #if defined(MAX) #if MAX == 0 printf("MAX是0"); #elif MAX > 0 printf("MAX大于0"); #else printf("MAX小于0"); #endif #endif //当然可以简化为 #ifdef MAX #endif //当然也就存在 #ifndef MAX #endif return 0; }
文件包含编译指令
文件包含指令就是包含文件用的,在前面我们都看到了 #include
#include <> //是在系统库中寻找 #include "" //是在我们自己写的文件中寻找
文件包含指令允许嵌套包含,但是不允许递归包含,就像文件啊包含了文件b,文件b包含了文件c,这是允许的,文件a包含了文件b,文件b也包含了文件a,这是不允许的。
但是如果文件a包含了文件b,文件c包含了文件a和文件b,这样语法没有问题,但是会导致重复包含,降低编译的效率,这样我们就可以使用下面的方法来处理这个问题。
#ifndef _A_H_ #define _A_H_ //在导入文件的时候会先检验是否定义过a中的变量、函数,没有的话会去定义,定义过的话就会跳过定义,往下执行。 #endif #ifndef _B_H_ #define _B_H_ #endif