内容正文:
编程语言基础——C语言
1.7 宏定义和文件包含
第1章 C语言概述
高等教育出版社
教学目标
一
了解C语言的编译预处理的含义和分类。
1
2
掌握宏定义及其使用方法。
3
了解文件包含的定义和操作步骤。
教学重难点
二
握宏定义及其使用方法。
1
2
了解文件包含的定义和操作步骤。
导入新课
三
前几节课我们发现C语言源程序中都是以#开头、以换行符结尾。你知道这些是什么吗?
新知讲授
四
5
C语言源程序中以#开头、以换行符结尾的行称为预处理指令。预处理指令不是C语言的语法成分,而是传给编译程序的各种指令。
(1)宏定义 (2)文件包含
#define #include
#undef
(3)条件编译 (4) 其他
#if #line
#ifdef #error
#else #pragma
#elif
#endif
1.不带参数的宏定义
宏定义
1.7.1
一般格式为:#define 标识符 字符串
定义中的“标识符”为用户定义标识符,称为宏名,宏名一般用大写字母。在预编译时,将程序中出现的宏名均替换成“字符串”的内容,这一过程称为宏展开。
宏定义指令名称
宏名
宏体
1.不带参数的宏定义
宏定义
1.7.1
例:
#define PI 3.1415926
则程序中凡遇PI均用3.1415926代替,如“2*PI*r”宏展开为“2*3.1415926*r”
1.不带参数的宏定义
宏定义
1.7.1
例:
#define PI 3.1415926
main()
{ float l,s,r,v;
printf(“input radius:”);
scanf(“%f”,&r);
l=2.0* 3.1415926 *r;
s= 3.1415926 *r*r;
v=4.0/3* 3.1415926 *r*r*r;
printf(“l=%.4f,s=%.4f,v=%.4f”,l,s,v);
}
#define PI 3.1415926
main()
{ float l,s,r,v;
printf(“input radius:”);
scanf(“%f”,&r);
l=2.0*PI*r;
s=PI*r*r;
v=4.0/3*PI*r*r*r;
printf(“l=%.4f,s=%.4f,”
“v=%.4f”,l,s,v);
}
宏展开
1.不带参数的宏定义
宏定义
1.7.1
注意:
1)宏替换时仅仅是将源程序中与宏名相同的标识符替换成宏的内容文本,并不对宏的内容文本做任何处理。
2)C语言程序员通常用大写字母来定义宏名,以便与变量名相区别。
3)宏定义时,如果字符串太长,需要写多行,可以在行尾使用反斜线“\”续行符。例如:
#define LONG_STRING "this is a very long \ string that is used as an example"
注意双引号包括在替代的内容之内。
1.不带参数的宏定义
宏定义
1.7.1
注意:
4)宏名的作用域是从#define定义之后直到该宏定义所在文件结束,但通常把#define宏定义放在源程序文件的开头部分。如果需要终止宏的作用域,可以使用#undef命令,其一般格式是:
#undef 标识符
2.带参数的宏定义
宏定义
1.7.1
一般格式为:#define 宏名(形式参数表) 字符串
定义中的“字符串”应包含括号中所指定的形式参数。
注意:宏名与括号之间不要加空格,否则就成为不带参数的宏定义了。
功能:不仅进行简单的字符串替换,还要进行参数替换。
3.带参数的宏展开
宏定义
1.7.1
预编译时,遇到带实参的宏名,则按命令行中指定的字符串从左到右进行转行,原则是:凡遇形参则以实参代替,非形参字符则原样保留,从而形成展开后的内容。
例如:
#define AREA(r) PI*(r)*(r)
则“AREA(3+2)”宏展开后变成“3.1415926*(3+2)*(3+2)”。
3.带参数的宏展开
宏定义
1.7.1
例1-3 求梯形的面积。
说明:梯形的面积为上底加下底乘高除2。
设梯形的上底、下底和高分别是a、b和h表示,则梯形的面积