C语言程序设计第8章 编译预处理
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2017/10/22
例如:
#define PI 3.14159 void main() { …… } #undef PI f1() { …… } 表示PI只在main函数中有效,在函数f1中无效。
2017/10/22
(5)对双引号括起来的字符串内的字符 ,即使与宏名同名,也不进行宏替换。
2017/10/22
(8)对“输出格式”作宏定义,可以减 少书写麻烦。
例8.4对输出格式作宏定义。 #include <stdio.h> #define P printf #define D "%d\t" #define F "%.2f\n" void main(){ int a=5, c=8, e=11; float b=3.8, d=9.7, f=21.08; P(D F,a,b); P(D F,c,d); P(D F,e,f); }
对上述程序进行宏替换后 ,其main函数相当于 void main() { int a=5, c=8, e=11; float b=3.8, d=9.7, f=21.08; printf("%d\t %.2f\n",a,b); printf("%d\t %.2f\n",c,d); printf("%d\t %.2f\n",e,f); } 程序运行情况如下: 5 3.80 8 9.70 11 21.08
宏名替换规则示例。 /*源文件名:AL8_3.c*/ #include <stdio.h> #define NUM 100 void main() { printf("NUM"); } 该程序经过编译、连接、运行,屏幕显示: NUM 从例8.3的运行结果可以看出,程序并未对 printf语句中被双引号括起来的NUM进行替 换,而是将“NUM”当作字符串处理。
ຫໍສະໝຸດ Baidu
#include <stdio.h> #define PI 3.1416 #define R 2.0 #define S PI*R*R #define PRN printf #define BEGIN main(){ #define END } BEGIN PRN("PI=%f\tR=%f\tS=%f\n", PI,R,S); END
2017/10/22
2.使用宏定义的优点
(1)可提高源程序的可维护性 (2)可提高源程序的可移植性 (3)减少源程序中重复书写字符串的工 作量
2017/10/22
3.宏替换
编译预处理时,在宏定义命令之后出现的所 有宏名,均被替换成代替字符串。这一过程 称为“宏替换”,又叫做“宏展开”。例8.2 进行宏替换后为: #include <stdio.h> void main() { printf("PI=%f\tR=%f\tS=%f\n", 3.1416,2.0,3.1416*2.0*2.0); } 该程序经过编译、连接、运行,屏幕显示: PI=3.1416 R=2.0 S=12.5664
C 语言程序设计
第8章 编译预处理
第8章 编译预处理
8.1 预处理引例 8.2 宏定义 8.3 文件包含 8.4 条件编译 本章小节
2017/10/22
8.1 预处理引例
例8.1使用带参宏,实现求三个数中的最大数并输出。 /* 源文件名:AL8_1.c */ #include <stdio.h> #define MAX(a,b) (a>b)?a:b void main() { float num1,num2,num3,max; printf("请输入三个数,数之间用空格隔开:\n"); scanf("%f%f%f",&num1,&num2,&num3); max = MAX(num1,num2); max = MAX(max,num3); printf("最大数为:%f",max); } 程序运行情况如下:
2017/10/22
(7)可用宏定义表示数据类型,使书写 方便,但在使用时格外小心。
例如: #define PIN int * 对语句: PIN x,y; 进行宏替换后变为: int * x,y; 表示x为整型的指针变量,y为一般的整型变 量,而并非两个都为指针变量。由这个例子 可见,宏定义虽然也可表示数据类型,但毕 竟是作字符代换。在使用时要分外小心,以 免出错。
请输入三个数,数之间用空格隔开: 5.2、4.8、7.9↙ 最大数为:7.900000
2017/10/22
8.2 宏定义
C语言提供了多种预处理功能,如宏
定义、文件包含、条件编译等。合理 地使用预处理功能会使编写的程序更 便于阅读、修改、移植和调试,也有 利于模块化程序设计。
2017/10/22
2017/10/22
4.有关宏定义的说明
(1)宏名一般用大写字母表示,以示与变 量名区别。但这并非是规定。 (2)宏定义不是语句,所以不能在行尾加 分号。否则,宏替换时,会将分号作为字符 串的1个字符,用于替换宏名。 (3)在宏替换时,预处理程序仅以按宏定 义简单替换宏名,而不作任何检查。如果有 错误,只能由编译程序在编译宏替换后的源 程序时发现。 (4)宏定义必须写在函数之外,其作用域 为宏定义命令起到源程序结束。如要终止其 作用域可使用#undef命令。
–
2017/10/22
(6)宏定义允许嵌套,在宏定义的字 符串中可以使用已经定义的宏名。在 宏替换时由预处理程序层层代换。
例如: #define PI 3.1415926 #define S PI*r*r /* PI是已定义的 宏名 */ 对语句: printf("%f",S); 进行宏替换后变为: printf("%f",3.1415926*r*r);
8.2.1 无参宏定义和宏替换
1.无参宏定义 无参宏定义的格式: #define 标识符 字符串 C语言中,以“#”开头表示这是一条预处理 命令。“define”为宏定义命令。“标识符” 为所定义的宏名。“字符串”可以是常数、 表达式、格式串等。
2017/10/22
例8.2
无参宏定义示例