资源描述:
《26编译预处理 课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、2.6编译预处理编译预处理:在对C源程序编译之前做一些处理,生成扩展的C源程序。三种常见编译预处理命令,即宏定义#define(本节重点和难点)文件包含#include条件编译#if--#else--#endif为了与C语言中的语句相区别,编译预处理命令以“#”开头。2.6.1宏定义(重点)1.不带参数的宏定义不带参数宏定义的一般形式为:#define宏名宏体其中,#define是宏定义命令,宏名是一个标识符(宏名一般用大写),宏体是一个字符序列。功能:用指定的宏名(标识符)代替宏体(字符序列)。使用目的:便
2、于程序的书写、阅读和修改。注意:行尾无“;”分号宏名两侧有空格【例1】计算以r为半径的圆的周长、圆的面积和球的体积宏定义的位置:在宏名使用之前即可(函数外或函数内均可)。但一般放在函数外(使用宏名的函数之前)。#definePI3.1415926main(){floatr,l,s,v;scanf("r=%f",&r);l=2*PI*r;s=PI*r*r;v=4.0/3*PI*r*r*r;printf("l=%fs=%fv=%f",l,s,v);}宏替换--编译预处理时的工作在用编译器对程序编译时,先做编译
3、预处理时的工作,此时,编译程序将所有的宏名替换成其对应的宏体,用宏体替换宏名的过程称为宏展开,也叫宏替换。如:例1中的程序,宏替换完成后将变成:main(){floatr,l,s,v;scanf(“r=%f",&r);l=2*3.1415926*r;s=3.1415926*r*r;v=4.0/3*3.1415926*r*r*r;printf("l=%fs=%fv=%f",l,s,v);}#definePI3.1415926main(){floatr,l,s,v;scanf("r=%f",&r);l
4、=2*PI*r;s=PI*r*r;v=4.0/3*PI*r*r*r;printf("l=%fs=%fv=%f",l,s,v);}宏名的作用域(使用范围)为宏定义命令之后到本源文件结束,或遇到取消该宏名处(#undef宏名)。可以在程序中取消前面的宏定义取消宏定义的命令是#undef,其一般形式为:#undef宏名说明:一个宏名可以多次使用,新的同名宏定义出现,就是对前面宏定义的取消。(宏名代表的宏体在使用时可以改变)注意:宏替换只作简单的字符替换,不作语法检查。【例2】阅读下面程序,写出运行结果#defi
5、neN4#defineMN+3main(){inta;a=M*N;printf("N=%d,M=%d,",N,M);printf("M*N=%d",a);#undefM#defineM(N+3)a=M*N;printf("N=%d,M=%d,",N,M);printf("M*N=%d",a);}〖运行结果〗:N=4,M=7,M*N=16N=4,M=7,M*N=284+3*44,4+3(4+3)*44,(4+3)注意:做有宏命令的题时一定要先进行宏名的字符替换,再解程序。注意:字符串内的不是宏名,不进行
6、替换。2.带参数的宏定义带参数宏定义的一般形式为:#define宏名(形参表列)宏体其中,#define是宏定义命令,宏名是一个标识符,形参表列是用逗号隔开的一个标识符序列,序列中的每个标识符都称为形式参数,简称形参。宏体是包含形参的一个字符序列。如:#defineS(a,b)a>b?a:bS是宏名,a、b是形参,a>b?a:b是宏体。宏名和(无空格使用带参数宏的一般形式为:宏名(实参表列);其中,实参表列是用逗号隔开的常量、变量或表达式。如:S(3,4);宏替换编译预处理时,用宏体中的字符序列从左向右替换,
7、如果是形参,则用程序语句中相应的实参替换,如果不是形参,则保留。注意:只作简单的字符替换。如:S(3,4);宏替换后为:#defineS(a,b)a>b?a:b3>4?3:4;取消带参数的宏定义的命令其一般形式为:#undef宏名(形参表列)【例3】阅读下面程序写出运行结果#defineX3#defineY4#defineM(a,b)a>b?a:bmain(){intval,x,y;scanf("%d%d",&x,&y);val=M(X,Y);printf("M=%d,",val);val=M(x,y);pr
8、intf("M=%d,",val);val=M(x+3,y+4)*M(x+3,y+4);printf("M=%d,",val);#undefM(a,b)3>4?3:4x>y?x:yx+3>y+4?x+3:y+4*x+3>y+4?x+3:y+4;#defineM(a,b)((a)>(b)?(a):(b))val=M(x+3,y+4)*M(x+3,y+4);printf("M=%d",val);}〖