内容正文:
第8章 编译预处理
8.1 宏 定 义
8.2 文件包含
8.1 宏 定 义
8.1.1无参宏定义
无参宏定义通常用来定义符号常量,即用一指定的宏名(标识符)来代表一个字符串,一般形式为:
#define 宏名 字符串
这就是已经介绍过的定义符号常量。如:
# define PI 3.1415926
它的作用是指定用标识符PI来代替“3.1415926”这个字符串。在编译预处理时,将程序中在该命令以后出现的所有的PI都用“3.1415926”代替。该过程称为宏展开。
下一页
返回
8.1 宏 定 义
宏定义中宏名常用大写字母表示,宏名与字符串之间用空格分隔。# define是宏定义命令。其中字符串可以是一个数值型数据、表达式或字符串。例如:
# define A 100
# define PR printf
# define B (30-(2*6))
# define S (A*B)
上一页
下一页
返回
8.1 宏 定 义
例8.1 从键盘连续输入字符,统计其中的大写字母的个数,直到按ESC键结束。
#include “stdio.h”
#define ESC 27
main( )
{
int count=0;
char c;
while ((c=getch())!=ESC)
if (c>=’A’ && c<=’Z’)
count++;
printf(“count=%d”,count);
}
上一页
下一页
返回
8.1 宏 定 义
其中,预处理程序将此程序中凡是出现ESC的地放都用27替换。如果ESC的编码值有所变化,只需修改宏定义语句即可,这样有助于程序的调试和移植。
上一页
下一页
返回
8.1 宏 定 义
使用符号常量应注意的事项:
(1)预处理模块只是用宏名作简单的替换,不作语法检查,若字符串有错误,只有在正式编译时才能检查出来。
(2)没有特殊的需要,一般在预处理语句的行末不加分号,若加了分号,则连同分号一起替换。
(3)使用宏定义可以减少程序中重复书写字符串的工作量,提高程序的可移植性。
(4)宏定义命令一般写在文件开头、函数之前,作为文件的一部分,宏名的有效范围为宏定义之后到本源文件结束。如果要强制终止宏定义的作用域,可以使用#undef命令。
(5)定义符号常量时,可以引用已定义的符号常量。
(6) 程序中用双括号括起来的字符串中的字符,若与符号常量同名,不进行替换。
上一页
下一页
返回
8.1 宏 定 义
8.1.2有参宏定义
利用#define命令不仅可以定义符号常量,也可以定义带参数的宏。一般形式为:
#define 宏名(参数表) 字符串
字符串中也包含参数表中的参数,该参数为形参。预编译程序根据宏定义用字符串替换程序中出现的带参数的宏,其中定义式中的形式参数用相应的实际参数替换,实参可以是常量、变量或表达式;若字符串中的某个字符不是形参,则在替换时保留。
上一页
下一页
返回
8.1 宏 定 义
#define MAX(a,b) ((a)>(b)?(a):(b))
main( )
{ int x,y;
printf (“输入两个数:”);
scanf (“%d,%d”,&x,&y);
printf (“MAX=%d”,MAX(x,y));
}
以上程序执行时,用字符串“((a)>(b)?(a):(b))”来替换MAX (a,b)。所以,可以输出两个数的较大者。
上一页
下一页
返回
8.1 宏 定 义
在程序设计中,经常要把反复使用的运算表达式定义为带参的宏。例如:
# define MIN (a,b) ( (a) < (b) ? (a) : (b)) /* 求两个数中的较小者 */
# define PER(a,b) (100.0*(a)/(b)) /* 求a是b的百分之几 */
# define ABS(x) ((x)>=0)? (x) : (-x) /* 求x的绝对值 */
# define ISO(x) (((x)%2= =1