资源描述:
《c语言编译预处理》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、编译预处理C语言程序设计Lecture8宏定义“文件包含”处理条件编译介绍C语言的三种基本编译预处理结构对源程序进行处理教学目标2作用:对源程序编译之前做一些处理,生成扩展C源程序种类:宏定义#define文件包含#include条件编译#if--#else--#endif等格式:“#”开头占单独书写行语句尾不加分号3一、宏定义C语言中可以定义变量,但有时需要定义一些常量,且能象变量一样引用。宏定义就起这样的作用。C语言中有两种宏定义命令:带参数的宏定义不带参数的宏定义41、不带参数的宏定义不带参数的宏定义通常用来定义符号常数,其一般格式
2、为:#define宏名替换序列#define——是定义语句宏名——是一个标识符,一般用大写字符替换序列——是给标识符的值例如:#definePI3.1415926#defineEBSL1.0E-15使用时:if(xn<=EBSL)break;5带参数的宏定义其作用和使用方法类似函数,一般格式为:#define宏名(参数表)带参替换序列例如:#definemax(a,b)((a)>(b)?(a):(b))使用时,可以写成:x=max(a,10);x=((a)>(10)?(a):(10));2、带参数的宏定义63、宏定义注意事项定义的是符号常
3、数,不是变量。错误的用法:PI=PI*PI;引用时参数最好使用圆括号,用法:定义:#definecircle_area(r)r*r*PI使用:s=circle_area(x+16);转换结果为:s=x+16*x+16*PI;只有按下列方法定义才行:#definecircle_area(r)(r)*(r)*PI7宏定义注意事项(续一)反斜杠“”是继续行标志符。例如#definech(c)((c>=‘A’)&&(c<=‘Z’)字符串化操作符“#”,使被操作对象变为字符串。例如,#defineout(x)printf(#x)使用时,引用ou
4、t(It‘sright.);将被替换为:printf(“It‘sright.”);8#define命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本文件结束。可以使用#undef命令终止宏定义的作用。其格式为:#undef标识符当程序中使用#undef命令后,对应的宏定义便立刻失去了意义。宏定义注意事项(续二)9例:#definex100#definey200main(){printf(“%s%d”,“Beforeundef→”,x+y);#undefyprintf(“%s%d”,“Afterundef→”,x+y);/
5、*编译时,此处将出错*/}10在进行宏定义时,可以引用已定义的宏名。调用宏时,层层展开。#defineA3#defineBA*A语句x=B;相当于x=A*A;相当于x=3*3;宏定义注意事项(续三)11宏定义注意事项(续四)连接操作符“##”。用于生成C源代码序列。例如,定义宏#definechop(x)func##x调用语句为:called=chop(3)(q,w);处理时将被扩展为:called=func3(q,w);通过使用‘##’操作符,编译时就能确定调用那一个函数。12#definechop(x)func##x#defineou
6、t(x)printf(#x)main(){inta,b,called;scanf("%d%d",&a,&b);called=chop(3)(a,b);printf("called=%d",called);called=chop(4)(a,b);printf("called=%d",called);out(It'sright!);printf("");}13子函数func1(intx,inty){return(x>y?x:y);}func2(intx,inty){return(x+y);}func3(intx,inty){ret
7、urn(x*y);}func4(intx,inty){return(x/y);}144、宏和函数的区别带参宏函数处理时间编译时程序运行时参数类型无类型问题定义实参,形参类型处理过程不分配内存简单的字符置换分配内存先求实参值,再代入形参程序长度变长不变运行速度不占运行时间调用和返回占时间15例#definePRINT(K)printf("K=%dt",K)main(){inta,b;a=1;b=2;PRINT(a);PRINT(b);}运行结果:K=1K=2在宏定义#definePI3.14159中,用宏名PI代替一个():A)单精度数B
8、)双精度数C)常量D)字符串16#defineN2#defineY(n)((N+1)*n)main(){intz;z=2*(N+Y(5));printf("%d",z);}例运行结果:3417