预编译
计算机术语
预编译是做些代码文本的替换工作。是整个编译过程的最先做的工作。
介绍
预编译是做些代码文本的替换工作。
处理以# 开头的指令 , 比如拷贝 #include 包含的文件代码,#define 宏定义的替换 , 条件编译等,就是为编译做的预备工作的阶段。
主要处理#开始的预编译指令,预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。
C 编译系统在对程序进行通常的编译之前,首先进行预处理。
预处理功能
c 提供的预处理功能主要有以下三种:
1 )宏定义。
2 )文件包含。
3 )条件编译。
何时需要预编译
编译指令
预编译指令指示了在程序正式编译前就由预编译器进行的操作,可以放在代码中任意行,一条预编译指令占用一行。常见的预编译指令有:
(1)#include 指令
(2)#define指令
该指令有三种用法:
第一种是定义标识,标识有效范围为本翻译单元本指令之后,形如#define XXX,常与#if配合使用;
第二种是定义常数,如#define max 100,则max代表100(这种情况下使用const定义常数更好,原因见注1);
(3)#if、#else和#endif指令
这些指令一般这样配合使用:
#if defined(标识) //如果定义了标识
要执行的指令
#else
要执行的指令
#endif
在头文件中为了避免重复调用(比如说两个头文件互相包含对方),常采用这样的结构:
#if !(defined XXX) //XXX为一个在你的程序中唯一的标识符
//每个头文件的标识符都不应相同。
#define XXX
真正的内容,如函数声明之类
#endif
注1:因为:const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误(边际效应)。
注2:例如get_max(a++, b)时,a++会被执行多少次取决于a和b的大小!所以建议还是用内联函数而不是这种方法提高速度。虽然有这样的弊病,但这种方法的确非常灵活,因为a和b可以是各种数据类型。
注3:可以查看百度百科的预处理命令,编排的比较简明。
参考资料
最新修订时间:2023-12-23 20:59
目录
概述
介绍
预处理功能
何时需要预编译
参考资料