文档介绍:第九章
本章要点
预处理的概念
C语言处理系统的预处理功能
预处理命令的使用
主要内容
宏定义
“文件包含”处理
条件编译
基本概念
ANSI C标准规定可以在C源程序中加入一些“预处理命令”,以改进程序设计环境,提高编程效率。
这些预处理命令是由ANSI C统一规定的,但是它不是C语言本身的组成部分,不能直接对它们进行编译(因为编译程序不能识别它们)。必须在对程序进行通常的编译之前,先对程序中这些特殊的命令进行“预处理”。
经过预处理后程序可由编译程序对预处理后的源程序进行通常的编译处理,得到可供执行的目标代码。
基本概念
C语言与其他高级语言的一个重要区别是可以使用预处理命令和具有预处理的功能。
C提供的预处理功能主要有以下三种:
这些功能分别用宏定义命令、文件包含命令、条件编译命令来实现。为了与一般C语句相区别,这些命令以符号“#”开头。例如:
#define
#include
宏定义
不带参数的宏定义
宏定义一般形式为:
#define 标识符字符串
例如:# define PI
宏定义的作用是在本程序文件中用指定的标识符PI来代替“”这个字符串,在编译预处理时,将程序中在该命令以后出现的所有的PI都用“”代替。这种方法使用户能以一个简单的名字代替一个长的字符串。
这个标识符(名字)称为“宏名”。
在预编译时将宏名替换成字符串的过程称为“宏展开”。#define是宏定义命令。
#include <>
#define PI
void main()
{float l,s,r,v;
printf("input radius:");
scanf("%f",&r);
l=*PI*r;
s=PI*r*r;
v=*PI*r*r*r;
printf("l=%\ns=%\nv=%\n",l,s,v);
}
使用不带参数的宏定义。
input radius: 4↙
运行情况如下:
1=
s=
v=
(1) 宏名一般习惯用大写字母表示,以便与变量名相区别。但这并非规定,也可用小写字母。
(2) 使用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量。
(3) 宏定义是用宏名代替一个字符串,只作简单置换,不作正确性检查。只有在编译已被宏展开后的源程序时才会发现语法错误并报错。
说明:
(4) 宏定义不是C语句,不必在行末加分号。如果加了分号则会连分号一起进行置换。
(5) #define命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束。通常,#define命令写在文件开头,函数之前,作为文件一部分,在此文件范围内有效。
(6) 可以用#undef命令终止宏定义的作用域。
例如:
说明:
#define G _______
void main() ↑
{ G的有效范围
…
} -----↓----
#undef G
f1()
{
…
}
在f1函数中,。这样可以灵活控制宏定义的作用范围。