最新C语言课件 第10章
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例如: #define PR(x) printf(#x) … PR(data undefined!); … 将替换成 … printf("data undefine!");
又如: #define str(s) #s … p=str(hello world); … 将替换成: … p="hello world";
始终应该记住:C预处理程序并不去理解用户编写 的C程序,它只是机械地按照宏替换的定义把程序中 的宏调用扩展为相应的字符序列,而不去“领会”其 含义。
4.#、##运算符和宏替换嵌套 在标准C语言中提供了两个仅用于宏替换的运算符: 连串运算符#和连结运算符# #。
① 在带参数的宏定义中,如果字符序列中的一个 形参前面有“#”,那么在进行宏替换时,对应的实参 就转换成用双引号括起来的字符串。
#define 宏名(参数表) 字符序列 例如,定义一个计算圆面积的宏:
#define PI 3.1415926536 #define area(r) (PI * r * r)
例 10-2 : 下 面 的 程 序 中 使 用 了 带 参 数 的 宏 , 它 计 算并输出给定半径的圆的面积。
#define PI 3.1415926536 #define area(r) (PI*r*r)
③ 带参数的宏替换也可以嵌套定义。
例 10-8 : 下 面 的 程 序 展 示 宏 的 嵌 套 定 义 和 替 换 , 以及#运算符的应用。
void main() {
float r; printf("Input:r=?\n"); scanf("%f",&r); printf("Area=%f\n",area(r)); }
② 带参数的宏替换与简单的宏替换在替换规则上 是一致的,都是机械地进行替换,而不去理解用户的 想法。
例10-4:本例说明宏替换可能存在副作用。 #define PI 3.1415926536 #define area(r) (PI*r*r)
3.带参数的宏和函数之间的比较
带参数的宏定义与函数是不同的,不要把二者混 淆起来。二者主要的区别有:
宏定义中不存在参数类型问题,不仅宏名无类型, 而且宏定义中的参数也无类型。宏名和它的参数都只 是一个符号代表,预处理时进行宏扩展。
而带参数的宏在预处理阶段进行宏扩展。宏扩展 只是简单wk.baidu.com进行字符替换,并不对参数做任何计算、 加工工作。
例如: #define debug(s,t) printf("x"#s"=%d,x"#t"=%s",
x##s,x##t)
… debug(1,2); 经预处理后,被替换成:
… printf("x""1""=%d,x""2""=%s",x1,x2); 在字符串字面量联接之后,就成为下面形式: printf(“x1=%d,x2=%s”,x1,x2);
通常在实参中出现的转义字符在进行宏替换时,# 运算符就在它的前面插入一个反斜线字符(\)。 如果调 用形式如下:
PR("Hello World");
则预处理时将它扩展为:
printf("\"Hello World\"");
② 连结运算符##可以出现在上述两种形式的宏定 义中。当进行宏替换时,在替换字符序列中(不是在实 参中)出现的##被删除,在##前面和后面出现的两个 形参被相应的实参所替换,并且把它们合成一个单词。 如果连结的结果构成宏名,则进一步执行宏替换处理。
④ 使用带参数的宏编写程序时,应注意:在宏定 义中宏名和左圆括号之间没有空格。我们看一下如下 宏定义:
#define area (r) (PI *(r)*(r)) 在area和“(”之间有空格。
例如, x = area(5.6);
替换后的结果为: x = (r) (3.1415926536 * (r) * (r))(5.6);
void main() {
printf("%f\n",area(4+6)); }
为了避免出现与常规理解上的不一致,建议对宏 定义中字符序列的整体和各个参数都用圆括号括起来。 例如,
#define area(r) (PI*(r)*(r)) 那么, area(4+6)将被替换为:
(3.1415926536*(4+6)*(4+6)) ③ 一个宏定义所带的参数可以多于一个,每个参 数在宏替换中可以出现多次。 #define AVG5(a,b,c,d,e) (((a)+(b)+(c)+(d)+ (e))/5)
#define LONG_STRING this is a very long string that is used as \ ↙
an example ⑦ 可以用宏定义来表示数据类型。
#define MAX 100 #define ENTRY struct entrytype 在程序中可用ENTRY定义变量: ENTRY table[MAX],* p;
C语言课件 第10章
10.1 预处理功能 10.2 文 件 包 含 10.3 条 件 编 译 10.4 其他预处理功能 10.5 库函数使用方式 10.6 常用标准输入/输出函数 10.7 文件及有关操作 10.8 其他一些常用的函数(宏)
⑥ 如果宏定义中的字符序列过长,在一行中放不 下,可在该行末尾加续行符“\”,后随一个换行符。
void main() {
printf("%f\n",area(6.18)); }
2.几点使用说明 ① 使用宏定义时所带的实参可以是常量、已被赋 值的变量名或者表达式。 例10-3:将例10-2的程序改写为交互式输入半径值 的方式。
#define PI 3.1415926536 #define area(r) (PI*r*r)
⑧ 如果宏名出现在#号之后,则不对它进行替换。 例如:
#define DEF define
#DEF N 10 ⑨ 宏名的有效范围是从定义它的地方开始到其所 在文件末尾或者用 #undef指令消除该宏定义为止。宏 名不受分程序结构的影响,在其有效范围内遵循宏替 换的规则。
10.1.2 带参数的宏定义 1.带参数宏定义的一般格式 带参数的宏定义的一般形式是: