资源描述:
《计算机本科C语言讲稿-编译预处理》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第六章预处理命令宏定义文件包含条件编译6.1概述1.所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。它由预处理程序负责完成。当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。C语言提供了多种预处理功能,如宏定义、文件包含、条件编译等。合理地使用预处理功能编写的程序便于阅读、修改、移植和调试,也有利于模块化程序设计。2可执行程序形成的三个过程预处理、编译和连接是形成可执行程序的三个重要过程,这三个过程的每一步都可将一种形
2、式的程序代码改变成另一种形式的程序代码。1)预处理程序负责处理组成程序的预处理命令,从而将带有预处理命令的程序文件转化为纯粹的C程序。c:turboc2zxjc1.cvoidp1(){printf(“****************”);}c:turboc2zxjc2.cvoidp2(){printf(“mynameiszxj”);}c:turboc2zxjc3.c#include“c1.c”#include“c2.c”main(){p1();p2();p1();}经过预处理程序
3、(预编译程序)的处理,从而将带有预处理命令的程序文件c3.c转化为:voidp1(){printf(“****************”);}voidp2(){printf(“mynameiszxj”);}main(){p1();p2();p1();}2)编译程序:将一个个C源程序翻译成对应的二进制代码文件(后缀名为.obj的文件)。3)连接程序:将组成程序的所有.obj和用到的库文件连接起来,形成一个完整的可执行程序。6.2宏定义在C语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。被定
4、义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。在C语言中,“宏”分为有参数和无参数两种。6.2.1无参宏定义其定义的一般形式为:#define标识符字符串其中的“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令。“define”为宏定义命令。“标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。例如:#defineN100#d
5、efineM(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("%d",&y);s=3*(y*y+3*y)+4*(y*y+3*y)+5*(y
6、*y+3*y);printf("s=%d",s);}对于宏定义还要说明以下几点:1)宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。2)宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。3)宏定义其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令。例如:#definePI3.14159main(){……}f1(){……}例如:#definePI
7、3.14159main(){……}#undefPIf1(){……}4)宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换。【例9.2】#defineOK100main(){printf("OK");printf("");}5)宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序层层代换。例如:#definePI3.1415926#defineSPI*y*y/*PI是已定义的宏名*/对语句:printf("%f",S);在宏代换后变为:printf("%f",3.141
8、5926*y*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