预编译的基本知识
预编译又称为预处理,是做些代码文本的替换工作。是整个编译过程的最先做的工作。处理以# 开头的指令 , 比如拷贝 #include 包含的文件代码,#define 宏定义的替换 , 条件编译等,就是为编译做的预备工作的阶段。主要处理#开始的预编译指令,预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。
常见的预编译指令有:
(1)#include 指令
该指令指示编译器将xxx.xxx文件的全部内容插入此处。若用<>括起文件则在系统的INCLUDE目录中寻找文件,若用" “括起文件则在当前目录中寻找文件。一般来说,该文件是后缀名为"h"或"hpp"的头文件。
注意:<>不会在当前目录下搜索头文件,如果我们不用<>而用”"把头文件名扩起,其意义为,先在当前目录下搜索头文件,再在系统默认目录下搜索。
(2)#define指令
该指令有三种用法:
- 定义标识:标识有效范围为本翻译单元本指令之后,形如#define XXX,常与#if配合使用;
- 定义常数:如#define max 100,则max代表100(这种情况下使用const定义常数更好,原因见注1);
- 定义"函数":如#define get_max(a, b) ((a)>(b)?(a):(b)) 则以后使用get_max(x,y)就可以得到x和y中较大的数,建议还是用内联函数而不是这种方法提高速度。虽然宏定义函数有这样的弊病,但这种方法的确非常灵活,因为a和b可以是各种数据类型。
- 定义"宏函数":如#define GEN_FUN(type) type max_##type(type a,type b){return a>b?a:b;} ,使用时,用GEN_FUN(int),则