资源描述:
《C语言程序设计基础与应用 第8章ppt课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第8章预处理8.1概述8.2宏定义8.3文件包含8.4条件编译8.5运行一个多文件的程序8.6常见错误分析8.7小结习题实验与实训在前面各章中,我们已多次使用过以符号“#”开头的预处理命令。例如包含命令#include,宏定义命令#define等。在源程序中,这些命令都放在函数之外,且一般是放在源文件的前面,它们被称为预处理部分。预处理是C语言的一个重要功能,它由预处理程序负责完成。所谓编译预处理,是指在对源程序进行编译之前,先对源程序中的编译预处理命令进行处理;然后再将处理的结果与源程序一起进
2、行编译,得到目标代码。8.1概述C语言提供了多种预处理功能,例如宏定义、文件包含、条件编译等。合理地使用预处理功能编写的程序便于阅读、修改、移植和调试,也有利于模块化程序设计。本章将介绍常用的几种预处理功能。在C语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。被定义为宏的标识符称为“宏名”。在编译预处理时,对程序中所有出现的宏名,都用宏定义中的字符串去替换,被称为“宏代换”或“宏展开”。8.2宏定义使用宏定义可以提高源程序的可维护性、可移植性,以及减少源程序中重复书写字符串的工作量。
3、宏定义是由源程序中的宏定义命令完成的。宏替换是由预处理程序自动完成的。在C语言中,宏分为带参数宏和无参数宏两种。下面分别讨论这两种宏的定义和调用。1.定义宏名后不带参数的宏为无参数宏。无参数宏定义的一般形式为#define宏名字符串其含义是将在程序中出现“宏名”的地方均用“字符串”来替代。前面使用过的符号常量的定义就是一种无参数宏定义。例如,#defineN10。又例如,#defineM(y*y+3*y),该宏定义表示在程序中出现M的地方均用表达式(y*y+3*y)替代。8.2.1无参数宏
4、例题8.1格式化输入/输出。#defineFORMAT"%f,%f,%f,%f"main(){floatx1,x2,x3,x4;printf("Pleaseenter4floatnumbers:");scanf(FORMAT,&x1,&x2,&x3,&x4);printf("");printf(FORMAT,x1,x2,x3,x4);}说明本例题中两次用到格式控制符"%f,%f,%f,%f"。通过使用宏,简化了源程序,同时又不易出错。例题8.2宏定义的正确使用。#defin
5、eM(y*y+3*y)main(){intresult,y;printf("Inputanumber:");scanf("%d",&y);result=3*M+4*M+5*M;printf("Result=%d",result);}说明上例程序中要注意的是,在宏定义中表达式(y*y+3*y)两边的括号不能少,否则会发生错误。2.使用宏应注意的问题(1)宏定义不是说明或语句,在行末不必加分号,如果加上分号则会连分号也一起被置换。(2)宏替换的作用范围是定义它的源文件。(3
6、)宏名通常使用大写字母表示。(4)宏定义必须写在函数之外,其作用域为自宏定义命令起到源程序结束。如果要终止其作用域,可以使用#undef命令。例如:#definePI3.14159main(){...}#undefPIf1(){...}这里,PI只在main()有效,在f1函数中无效。(5)宏名在源程序中若用引号括起来,则预处理程序不对其作宏替换。例如:#defineOK100main(){printf("OK");printf("");}虽然定义宏名OK表示1
7、00,但在printf语句中OK被引号括起来,因此不作宏替换。C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调用中不仅要宏展开,而且要用实参去替换形参。带参数宏的定义形式一般为:#define宏名(形参表)字符串,其含义是作相应的参数替换。带参数宏调用的一般形式为:宏名(实参表);8.2.2带参数宏例题8.3带参数宏的使用。#defineMAX(a,b)(a>b)?a∶bmain(){intnum_1,num_2,max;prin
8、tf("Inputtwonumbers:");scanf("%d%d",&num_1,&num_2);max=MAX(num_1,num_2);printf("Max=%d",max);}说明上例程序的第1行进行带参数宏定义,第7行max=MAX(num_1,num_2)为宏调用,实参num_1,num_2将分别替换形参a,b。注意(1)带参数宏定义中,宏名和形参表之间不能有空格。例如,本例中的宏如果写为#defineMAX(a,b)(a>b)?a∶b,将被认为