预编译

更新时间:2023-12-23 20:59

预编译是做些代码文本的替换工作。是整个编译过程的最先做的工作。

介绍

预编译是做些代码文本的替换工作。

处理以# 开头的指令 , 比如拷贝 #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:可以查看百度百科的预处理命令,编排的比较简明。

免责声明
隐私政策
用户协议
目录 22
0{{catalogNumber[index]}}. {{item.title}}
{{item.title}}