c程序设计第九章.pptx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《c程序设计第九章.pptx》由会员分享,可在线阅读,更多相关《c程序设计第九章.pptx(29页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 编译预处理是指,在对源程序进行编译之前,系统将自动引用预处理程序对源程序中的预处理部分作处理;然后再将处理的结果,和源程序一起进行编译,以得到目标代码。编译连接预处理编译C源程序(无预处理命令)C源程序(有预处理命令)执行程序目标程序具体过程如下:第1页/共29页语言提供了多种预处理功能,如宏定义、文件包含、条件编译等。合理地使用预处理功能编写的程序便于阅读、修改、移植和调试,也有利于模块化程序设计。预处理的命令有以下几个特点:1预处理命令均以#开头,结尾不加分号;2预处理命令可以放在程序中任何位置,作用范围从定义处到文件结尾。第2页/共29页宏提供了用一个标识符来表示一个字符串的机制,实际
2、上就是一种替换,有时称为宏替换。在编译预处理时,对程序中所有出现的“宏”,都用宏定义中的字符串去代换。宏定义由宏定义命令完成,宏代换是由预处理程序自动完成的。使用宏的优点:(1)可提高源程序的可维护性、可移植性(2)减少源程序中重复书写字符串的工作量第3页/共29页C语言中的宏分为有参宏和无参宏两种1、无 参数的宏一般形式:#define 标识符 字符串 define:宏名的关键字标识符:定义的宏名,通常用大写字母取名,以便于与变量区别;语言符号字符串:即宏体,可以是常数、表达式、格式串等。例如:#define PI 3.1415926定义了一个符号常量PI,表示用标识符PI替换3.14159
3、26。在编译预处理时,会将程序代码中所有的PI都用3.1415926替换。第4页/共29页(1)宏名一般用大写字母表示,便于与变量名区别;一般将字符个数较多的字符串用一个宏名替换,减少程序中多处引用字符串书写错误。(2)宏定义是用宏名来表示一个字符串,在宏展开时以该字符串取代宏名,这只是一种简单的代换,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。(3)宏定义不是语句,在行末不加分号,如加上分号则连分号也一起置换。2.关于不带参数的宏定义的几点说明:(4)宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令。例如:#d
4、efine PI 3.14159main()#undef PI /*终止宏定义PI*/min().表示PI只在main函数中有效,在min中无效。第5页/共29页(5)宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换。2.关于不带参数的宏定义的几点说明:(6)宏定义可以嵌套,但嵌套的宏定义名要是已经定义的宏名。在宏展开时由预处理程序层层替换。例如:#define R 14.256#define PI 3.1415926#define S PI*R*R /*PI、R是已定义的宏名*/则语句 printf(%f,s);在宏代换后变为 printf(%f,3.1415926*14.256*1
5、4.256);(7)可用宏定义表示数据类型,使书写方便。例如:#define STU int 在程序中可用STU替换数据类型int。第6页/共29页3、无参宏的应用举例 例 9.1 不带参数的宏的程序#include#define PI 3.1415926#define STRING This is a test main()float r,s;printf(“STRING n);scanf(%f,&r);s=PI*r*r;printf(“s=%10.3fn,s);宏定义不是语句,所以不能在行尾加分号。否则,宏展开时,会将分号作为宏体中的1个字符。在宏展开时,预处理程序仅以宏体替换宏名,而不作
6、任何检查第7页/共29页3、无参宏的应用举例 例 9.2在进行宏定义时,可以引用已定义的宏名。#define PI 3.1415926#define L PI*r*2#define AR PI*r*r#define VO AR*r*4/3 main()float r;printf(“Input a radius:);scanf(“%f,&r);printf(“length=%.2f,area=%.2f,L,AR);printf(“vo=%.2fn,VO);在进行宏定义时,在进行宏定义时,可以引用已定义的可以引用已定义的宏名宏名,层层置换层层置换第8页/共29页3、无参宏的应用举例 例9.3#d
7、efine N 2#define M N+1#define NUM 2M+1 main()int i;for(i=1;i=NUM;i+)printf(“%d n”,i);宏展开后的等价程序如下:main()int i;for(i=1;i=6;i+)printf(“%d n”,i);NUM宏展开:宏展开:2*N+1+1 再宏展开:再宏展开:2*2+1+1第9页/共29页带参宏定义说明:(1)定义有参宏时,宏名与左圆括号之间不能留有空格。否则,编译系统将空格以后的所有字符均作为替代字符串,而将该宏视为无参宏。(2)有参宏的展开,只是将实参作为字符串,简单地置换形参字符串,而不做任何语法检查。在定义
8、有参宏时,在所有形参外和整个字符串外,均加一对圆括号。4带参宏定义(1)带参宏定义格式:#define 宏名(形参表)宏体(2)带参宏调用格式:宏名(实参表)(3)宏展开:用宏调用提供的实参字符串,直接置换宏定义命令行中相应形参字符串,非形参字符保持不变第10页/共29页 例例9.4 带参数的宏带参数的宏#define DS(a)1.0/a main()float r1,r2,r;r1=5.5;r2=50.8;r=DS(r1)+DS(r2);printf(“R=%fn”,1.0/r);运行结果运行结果:R=4.962700形参:形参:a实实参:参:r1,r24带参宏定义第11页/共29页 例例
9、9.5 带参数的宏带参数的宏#include#define F(a)a*a /*宏名宏名F,形参形参a*/main()int x=3,y=4,b,z;b=x+y;z=F(x+y);printf(b=%dnz=%dn,b,z);/*展开为展开为z=x+y*x+y;*/4带参宏定义第12页/共29页(1)在函数调用时,是先求出实参表达式的值,再传递给形参,而宏定义只是简单的字符替换;(2)函数调用是在程序运行时处理的,分配存储单元,而宏展开(调用)是在编译预处理时进行的,展开时不分配内存单元,不进行值传递,没有返回值的概念;(3)对函数实参和形参都要定义类型,而宏不存在类型,宏定义时字符串可以是任
10、何类型数据,一律看成字符串,宏名也没类型,只是一个符号表示,展开时代入指定的符号即可。5.带参的宏和带参函数区别第13页/共29页 (4)定义带参数的宏,可以实现一些简单的函数功能。#define MAX(x,y)(x)(y)?(x):(y)main()int a,b,c,t;t=MAX(a+b,c+d);/*展开后为展开后为 t=(a+b)(c+d)?(a+b):(c+d)*/如果第一行写成:#define MAX(x,y)xy?x:y 则展开后为 t=a+bc+d?a+b:c+d;因为置换展开是用“表达式”对等的置换“形参表”中的参数。5.带参的宏和带参函数区别第14页/共29页 例例9.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 第九
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内