第十三章:预处理
预处理功能是C语言特有的功能,可以使用预处理和具有预处理的功能是C
语言和其他高级语言的区别之一。预处理程序包含许多有用的功能,如宏定义、条件编译等,使用预处理功能便于程序的修改、阅读、移植和调试,也便于实现模块化程序设计。
通过本章的学习,您可以:
1、掌握宏定义相关内容
2、掌握文件包含相关内容
3、掌握编译相关内容
**
13.1 宏定义
**
在前边的学习中经常遇到用#define命令定义符号常量的情况,其实使用#define命令就是要定义一个可替换的宏。宏定义是预处理命令的一种,它提供了一种可以替换源代码中字符串的机制。根据宏定义是否有参数,可以将宏定义分为不带参数的宏定义和带参数的宏定义两种,下面分别进行介绍。
13.1.1 不带参数的宏定义
宏定义指令#defne 用来定义一个标识符和一个字符串,以这个标识符来代表这个字符串,在程序中每次遇到该标识符时就用所定义的字符串替换它。宏定义的作用相当于给指定的字符串起一个别名。
不带参数的宏定义一般形式如下:
#define 宏名 字符串
#表示这是一条预处理命令
宏名是一个标识符,必须符合C语言标识符的规定
字符串这里可以使常数,表达式,格式字符串等。
例如:
#define PI 3.14159
该语句的作用是在该程序中用 PI替代 3.14159,在编译预处理时,每当在源程序中遇到 PI就自动用 3.14159 代替。
使用#define 进行宏定义的好处是需要改变一个常量时只需改变#define 命令行,整个程序的常量都会改变,大大提高了程序的灵活性。
宏名要简单且意义明确,一般习惯用大写字母表示以便与变量名相区别。
注意:宏定义不是C语句,不需要在行末加分号。
宏名定义后,即可成为其他宏名定义中的一部分。例如,下面代码定义了正方形的边长、周长及面积的值。
#define SIDE 5
#define PERIMETER 4SIDE
#define AREA SIDESIDE
前面强调过宏替换是以串代替标识符。因此,如果希望定义一个标准的邀请语,可编写如下代码:
#define STANDARD “You are welcome to join us”
printf(STANDARD);
编译程序遇到标识符 STANDARD 时,就用"You are welcome to join us"替换。
关于不带参数的宏定义有以下几点需要强调:
1、如果在字符串中含有宏名,则不进行替换。例如:
#include<stdio.h>
#define TEST “This is an example”
main()
{
char exp[30]=“This TEST is not that TEST”;
printf(“%s\n”,exp);
printf(“%s\n”,TEST);
}
该段代码输入结果如图 13.1 所示,
注意上面程序字符串中的TEST并没有用"this isan example"来替换,因此如果串中含有宏名,则不进行替换、
2、如果串长于一行,可以在该行末尾用一反斜杠“\”续行。
3、#define 命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到此源文件结束。
注意:在编写程序时通常将所有的#detine放到文件的开始处或独立的文件中,而不是将它们分散到整个程序中。
4、可以用#undef命令终止宏定义的作用域。
例如:
#define<stdio.h>
#define TEST “This is an example”
main()
{
printf(TEST);
#undef TEST