概述
C++语言允许用预处理命令在程序中写一些命令行,这些预处理命令不是C++语言本身的组成部分,不能进行编译,而是进行“预处理”。
预处理命令都以 “ # ” 开头,允许出现在程序中的任意位置,但一般写在程序的首部。
C++提供的预处理功能:
- 宏定义
- 文件包含
- 条件编译
宏定义
不带参数的宏定义
实质上就是用一个宏名来代表一个字符串,格式为:
# define 宏名 宏体
在预编译时,将宏名代换成字符串的过程称为 宏代换 ;
宏名一般习惯用大写字母表示;
当需要改变某一变量的值时,可以只改变 #define 命令行,易于修改程序;
可以用 #undef 命令终止宏定义的作用域,同样写在函数外,格式为:
# undef 宏名
在进行宏定义时,可以引用上方已经定义的宏名,进行层层代换,如下:
#include<iostream>
using namespace std;
#define R 5.0
#define PI 3.14
#define L 2*PI*R
#define S PI*R*R
int main(){
cout<<L<<endl<<S<<endl;
return 0;
}
带参数的宏定义
用宏定义还可以定义带参数的宏,格式如下:
#define 宏名(参数表)宏体
其中,宏名是一个自定义的标识符;
参数表可以有一或多个参数,相当于函数的形参列表,但没有类型名;
宏体就是被代换用的字符序列,功能类似于函数的返回值;
注意点:
- 宏定义的字符串应写在一行上,若需要写在多行上时,应在一行尾使用续行符 \ ;
- 在书写带参数的宏定义时,宏名与参数列表中间不能有空格,否则空格右边的字符都将作为字符串;
- 当参数在真正使用时是两个数的和或差,应该在宏体里的每个参数外都加上圆括号,以免出现优先级问题;
- 宏代换是在编译前进行的,在代换是不分配内存单元,不进行值的传递,也没有返回值的概念;
- 在宏代换时不会进行运算,只有简单粗暴的替换;
- 宏代换不占用运行时间,只占用编译时间。
文件包含处理
一般程序使用已有文件时,文件包含命令格式如下:
# include < 文件名 >
使用同程序的其他自定义文件时,文件包含命令格式如下:
# include " 文件名 "
系统头文件中的内容包括:
- 对标准库函数的原型声明
- 符号常量定义
- 类型定义