C语言程序设计(姜学峰版)第九章_第1页
C语言程序设计(姜学峰版)第九章_第2页
C语言程序设计(姜学峰版)第九章_第3页
C语言程序设计(姜学峰版)第九章_第4页
C语言程序设计(姜学峰版)第九章_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1,第九章编译预处理9.1宏定义9.2文件包含处理,2,概述1.TurboC的编译过程TC整个编译过程分两步:编译预处理和正式编译;编译预处理根据编译预处理命令进行;正式编译在预处理的基础上进行,包括词法、语法分析和目标代码的生成。由于TC采用单趟扫描编译,因而在发出编译命令后,编译预处理和正式编译一次完成,其间不会产生预处理后的中间文件。,3,2.预处理命令的分类主要有三类:宏定义文件包含条件编译(改善程序的可移植性)3.预处理命令的使用要求1)以#号打头;2)不是C语句,而不必以分号结束;3)通常书写在函数之外、源文件开头;,4,9.1宏定义用一个标识符来代表一个字符串;宏定义分为不带参数和带参数的宏定义。1.无参宏定义一般形式:#define宏名宏字符串其中:1)define是宏定义命令名;2)宏名按C标识符命名规则命名,通常字母大写;3)宏串是不加双引号的字符序列;4)当宏串为数字串时,宏名又称为符号常量。,5,作用:在编译预处理阶段,将定义点之后的宏名全部用宏串替换;替换过程也称为宏展开。意义:1)便于参数的修改,一改全改;2)一次定义可多处引用。,6,例:输入半径r,求圆周长和圆面积。#definePI3.141592main()floatr,c,s;printf(Enterradius:);scanf(%f,Enterradius:1C=6.28S=3.14,7,使用说明:1)利用TC的预处理实用程序CPP.EXE,可仅完成预编译并产生预编译的中间文件,其扩展名为.i对上例:执行CPP.EXE程序对EXA91.C进行预处理:C:TC30CPPC:ZYCCPRGEXA91.C显示预编译中间文件的内容:C:TC30TYPEEXA91.I,8,2)一个宏命令只能定义一个宏名;3)宏串中的每个字符都是有效字符;下例多余字符均导致编译出错:#definePI3.141592宏展开结果:c=2.0*3.141592*r;#definePI3.141592;宏展开结果:c=2.0*3.141592;*r;,9,4)宏定义可书写在函数之外的任何位置;一个宏名的有效范围是定义点开始直到本源文件结束;但可利用宏终止命令加以限定;如:#defineG9.8main()宏名G有效;fun1()main、fun1可引用。#undefGfun2(),10,5)字符串中与宏名相同的字符不被替换;6)宏串中可出现已定义的宏名,这种现象称为宏的嵌套定义;如:#defineR3.0#definePI3.141592#defineC2.0*PI*R#defineSPI*R*Rmain()printf(C=%fnS=%fn,C,S);最终输出项C替换为:2.0*3.141592*3.0S替换为:3.141592*3.0*3.0,11,例:一程序多处使用相同的输入提示、多处使用相同的输出格式字符串,为减少书写量,使用宏定义来实现。#definePROMPTprintf(Pleaseinputdata:)#defineFORMATResult:%d,%d,%d,%dnmain()inta,b,c,d,e,f;PROMPT;/*宏引用*/scanf(%d,%d,%d,12,2.带参数的宏定义定义一般形式:#define宏名(形参字串表)宏串带参的宏引用:宏名(实参字串表)其中:1)形参字串应是宏串的子字串,长度可为1或更大;2)实参字串应与形参字串个数相同;带参的宏展开过程:在宏串替换宏引用的过程中,将宏串从左到右逐一展开,遇到与形参相同的字符串,则用对应的实参字符串顶替,遇到其它字符则按顺序正常展开。,13,例:计算以a、b为半径的圆面积之和及以a、b之和为半径的圆面积。#defineS(r)3.141592*r*rmain()floata=2.0,b=3.0,area1,area2,area3;area1=S(a);/*area1=3.141592*a*a;*/area2=S(b);/*area2=3.141592*b*b;*/area3=S(a+b);/*area3=3.141592*(a+b)*(a+b);*/printf(Totalarea:%-7.2fn,area1+area2);printf(R:%-7.2fCirclearea:%-7.2fn,a+b,area3);,14,带参的宏使用说明:1)带参的宏展开过程中出现的实参顶替形参是字符的顶替,而不是值的顶替;如上例宏引用S(a):实参字符a顶替形参字符r,不是a的值2.0顶替r;上例宏引用S(a+b):实参字符串(a+b)顶替形参字符r;2)为了保证宏展开的结果符合设计本意,应在宏串或实参字串中加入必要的括号;如:#defineS(r)3.141592*(r)*(r),15,3)宏定义中宏名与参数的括号间不能有空格;如:#defineS(r)3.141592*(r)*(r)宏串由于出现了空格,则认为S是宏名而且无参。4)TC对宏串中双引号范围内的内容不予替换;如:#definePR(V)printf(V=%dt,V);main()inta=1,b=2;PR(a);/*printf(V=%dt,a);*/PR(b);/*printf(V=%dt,b);*/,16,例:计算四边形的面积。#includemath.h#defineS(a,b,c)(a+b+c)/2.0#defineAREA(s,a,b,c)sqrt(s*(s-a)*(s-b)*(s-c)floatfun(floatx,floaty,floatz)floatarea,t;t=S(x,y,z);/*t=(x+y+z)/2.0;*/area=AREA(t,x,y,z);return(area);/*area=sqrt(t*(t-x)*(t-y)*(t-z);*/main()floata,b,c,d,e,area;scanf(%f,%f,%f,%f,%f,17,例:#defineN2#defineY(n)(N+1)*n)执行语句z=N*(2+Y(5);后的z值?,宏展开后的语句:z=2*(2+15);z值为34。,例:#defineMAX(x,y)(x)(y)?(x):(y)语句t=MAX(a+b,c+d);的展开结果?,宏展开后的语句:t=(a+b)(c+d)?(a+b):(c+d);,18,9.2文件包含预处理命令命令一般形式:#include文件名其中:1)include是文件包含命令名;2)文件名指出需要包含的文件名;可是系统头文件、用户头文件、用户源程序文件的名字;3)文件名前可带盘符、路径。作用:在预编译阶段,将被包含文件的内容包含到本源文件中,使正式编译的对象是包含后的整体。,19,例:输入半径r,求圆周长和圆面积。方法:将宏定义等预处理命令编辑在一个用户头文件中,并保存在c:zyccprgMY.H;将程序函数编辑在源文件EXA95.C中;MY.H:#definePI3.141592EXA95.C#includec:zyccprgmy.h/*预编译时将my.h的*/main()/*内容包含到此处*/floatr,c,s;printf(Enterradius:);scanf(%f,20,例:求34矩阵最大元素及位置,程序的两个函数分别编制在MYPRG.C和EXA96.C两个源文件中。MYPRG.Cintfun1(intx4)inti,j,max;max=x00;line=col=0;/*不必对外部变量声明*/for(i=0;imax)max=xij;line=i;col=j;return(max);,21,EXA96.Cintline,col;/*全局变量定义*/#includec:zyccprgmyprg.c/*将myprg.c包含到此*/main()inta34=1,2,3,4,5,6,7,8,9,10,11,12,i,j,max;for(i=0;i3;i+)/*按行输出矩阵*/printf(n);for(j=0;j4;j+)printf(%4d,aij);max=fun1(a);/*函数调用*/printf(nMAX:a%d%d=%dn,line,col,max);注:用这种包含源文件的方法也可调试多源文件程序;此时不必作外部函数声明、不必建立项目文件。,22,例:包含系统头文件#includestdio.h#includemath.hmain()charstr80;floatx,y;printf(Enterastring:);gets(str);printf(Enteradata:);scanf(%f,23,文件包含说明:1)系统头文件存放在C:TC30INCLUDE目录中,扩展名为.h。头文件是文本文件,内容是相关的宏定义、结构定义等;2)”与的区别”先在当前目录查找指定的头文件,未找到再沿TC的设置查找;仅在TC的设置中查找;,24,函数举例:例:用自定义函数判断素数;main中输出100200之间的全部素数。#includemath.hmain()intnum,m,count=0,prime(int);for(num=101;num=199;num=num+2)m=prime(num);if(m)printf(%5d,num);count+;if(count%10=0)printf(n);,25,main();for(num=101;num=199;num=num+2)m=prime(num);if(m);intprime(intn)inti,k,mark=1;k=sqrt(n);for(i=2;i=k;i+)if(n%i);/*余数非零为真*/elsemark=0;break;return(mark);,26,例:用自定义函数将一方阵在原数组中转置。#defineN5main()voidchange(inta),parray(intaN);intaNN,i,j;printf(nEnterAarray(%d):,N*N);for(i=0;iN;i+)for(j=0;jN;j+)scanf(%d,27,voidchange(intaNN)inti,j,t;for(i=0;iN;i+)/*以对角线为对称

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论