资源描述:
《C程序设计09.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、2021/10/3第九章编译预处理1第九章编译预处理C语言具有编译预处理的功能所谓编译预处理,指在编译之前先执行一些特殊的命令(以#开头的命令)C的预处理功能包括:宏定义文件包含条件编译2021/10/3第九章编译预处理2第一节宏定义宏定义不带参数的宏定义带参数的宏定义2021/10/3第九章编译预处理3一、不带参数的宏定义不带参数的宏定义指定一个标识符(宏名)用来代表一部分字符如:#definePI3.1415926#defineNUMBER100宏展开编译预处理时用字符串替换宏名举例:程序中s=PI*r*r;则替换为:s=3.1415926*r*r
2、然后编译2021/10/3第九章编译预处理4宏的作用:简化书写、易于阅读、便于修改#definePI3.1415926536intmain(){floatr,l,s;scanf(“%f”,&r);s=r*r*PI;l=2*PI*r;printf(“s=%f,l=%f”,s,l);return0;}2021/10/3第九章编译预处理5如:排序(某班考试分数排序,人数变化时)intmain(){inti,j,k,a[30];/*人数为30*/for(i=0;i<=29;i++)scanf(“%d”,&a[i]);for(i=0;i<=29;i++){k
3、=i;for(j=0;j<=29;j++)…………}return0;}2021/10/3第九章编译预处理6下面的程序在人数变化时易于修改#defineNUMBER30intmain(){inti,j,k,x,a[NUMBER];for(i=0;i<=NUMBER-1;i++)scanf(“%d”,&x);for(i=0;i<=NUMBER-1;i++){k=i;for(j=0;j<=NUMBER-1;j++)…………}……return0;}2021/10/3第九章编译预处理7注意事项:习惯上,宏名用大写字母表示(区别于变量)宏展开时仅仅将宏名用字符串替
4、换,不作任何检查,也不计算其值如:#definePI3.i415926程序中s=PI*r*r;预处理时置换成:s=3.i415926*r*r;又如:#defineR3+2程序中:s=3.141593*R*R;替换为:s=3.141593*3+2*3+22021/10/3第九章编译预处理8修改方法有两种:#defineN(3+2)s=3.141593*N*N#defineN3+2s=3.141593*(N)*(N)宏定义不是语句,不能加分号,否则,分号也被当作是字符串的一部分如:#definePI3.1415926;程序中s=PI*r*r;预处理时置换成
5、:s=3.1415926;*r*r;宏定义通常定义在函数的外面,其作用范围是:从定义处开始到文件末2021/10/3第九章编译预处理9可以用#undef命令终止宏定义的作用如:#defineG9.8…………#undefG…………宏可以嵌套定义如:#defineR3.0#definePI3.141593#defineL2*PI*R#defineSPI*R*R2021/10/3第九章编译预处理10程序中用双引号括起来的字符串,其中的字符即便与宏名相同,也不置换(不作宏处理)如:#defineNUMBER50intx;……printf(“THENUMBERI
6、S%d”,x);……2021/10/3第九章编译预处理11二、带参数的宏定义带参数的宏定义指定一个带参数的宏名用来代表一部分字符,字符中含有参数如:#defineS(a,b)a*b宏展开编译预处理时用字符串替换宏名,用实参替换虚参举例:程序中area=S(3,2);则替换为:area=3*2;2021/10/3第九章编译预处理12注意事项:习惯上,宏名用大写字母表示(区别于变量)宏展开时仅仅将宏名用字符串替换,不作任何检查,也不计算其值如:#defineS(a)a*a程序中:s=S(x+y);替换为:s=x+y*x+y;/*修改方法有两种*/若双引
7、号中的字符和虚参相同,TurboC不作替换2021/10/3第九章编译预处理13如:#definePRINT(V)printf(“V=%d”,V)intmain(){inta,b;a=1;b=2;PRINT(a);/*printf(“V=%d”,a);*/PRINT(b);/*printf(“V=%d”,b);*/return0;}设计者希望输出:a=1b=2实际输出结果:V=1V=22021/10/3第九章编译预处理14带参数的宏和函数的比较:宏是在预编译时展开的,而函数是程序运行时调用的宏展开时仅仅作简单的字符串替换和参数替换,既不给参
8、数分配单元,也不求解实参的值使用宏可以减少源文件的书写,但不能缩短执行代码(对于最终的.exe