资源描述:
《最新计算机本科C语言讲稿-编译预处理幻灯片.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、计算机本科C语言讲稿-编译预处理6.1概述1.所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。它由预处理程序负责完成。当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。C语言提供了多种预处理功能,如宏定义、文件包含、条件编译等。合理地使用预处理功能编写的程序便于阅读、修改、移植和调试,也有利于模块化程序设计。2可执行程序形成的三个过程预处理、编译和连接是形成可执行程序的三个重要过程,这三个过程的每一步都可将一种形式的程序代码改变成另一种形式的程序代码。1)预处理程序
2、负责处理组成程序的预处理命令,从而将带有预处理命令的程序文件转化为纯粹的C程序。6.2宏定义在C语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。在C语言中,“宏”分为有参数和无参数两种。6.2.1无参宏定义其定义的一般形式为:#define标识符字符串其中的“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令。“define”为
3、宏定义命令。“标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。例如:#defineN100#defineM(y*y+3*y)#definePRprintf【例6.1】#defineM(y*y+3*y)main(){ints,y;printf("inputanumber:");scanf("%d",&y);s=3*M+4*M+5*M;printf("s=%d",s);}宏定义宏调用经过预处理程序处理(宏展开)之后纯粹的C代码main(){ints,y;printf("inputanumber:");scanf(
4、"%d",&y);s=3*(y*y+3*y)+4*(y*y+3*y)+5*(y*y+3*y);printf("s=%d",s);}对于宏定义还要说明以下几点:1)宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。2)宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。3)宏定义其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令。例如:#definePI3.14159main(){……}f1(
5、){……}例如:#definePI3.14159main(){……}#undefPIf1(){……}4)宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换。【例9.2】#defineOK100main(){printf("OK");printf("");}5)宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序层层代换。例如:#definePI3.1415926#defineSPI*y*y/*PI是已定义的宏名*/对语句:printf("%f",S);在宏代换后变为:printf("%f",3.1415926*y*
6、y);6)习惯上宏名用大写字母表示,以便于与变量区别;但也允许用小写字母。7) 对“输出格式”作宏定义,可以减少书写麻烦。【例6.3】中就采用了这种方法。#definePprintf#defineD"%d"#defineF"%f"main(){inta=5,c=8,e=11;floatb=3.8,d=9.7,f=21.08;P(DF,a,b);P(DF,c,d);P(DF,e,f);}6.2.2带参宏定义C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参
7、。带参宏定义的一般形式为:#define宏名(形参表)字符串带参宏调用的一般形式为:宏名(实参表);例如:#defineM(y)y*y+3*y/*宏定义*/……k=M(5);/*宏调用*/……经预处理程序的预编译,在宏展开时,用实参5去代替形参y,宏展开后的语句为:k=5*5+3*5【例6.4】#defineMAX(a,b)(a>b)?a:bmain(){intx,y,max;printf("inputtwonumbers:");scanf("%d%d",&x,&y);max=MAX(x,y);printf("max=%d",max);}经预编译后
8、:main(){intx,y,max;printf("inputtwonumbers:");s