欢迎来到天天文库
浏览记录
ID:44398681
大小:590.00 KB
页数:20页
时间:2019-10-21
《c语言程序设计与项目实践第12章》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、第12章编译预处理本章的学习重点◆宏定义的概念和应用◆头文件包含◆条件编译12.1宏定义C语言中,预处理命令是由ANSIC(AmericanNationalStandardInstituteC)统一规定的,但它本身不属于C语言的组成部分,因此编译系统不能直接对它们进行编译。基于以上原因,系统在对程序进行编译(词法和语法分析、代码生成和优化等)之前,首先需要对程序中的预处理命令进行“预处理”。例如:程序中使用#include命令包含头文件stdio.h:#include则系统在预处理时
2、,将stdio.h文件中的代码原样代替该命令。12.1.1什么是宏定义宏定义使用#define命令表示1.无参数宏定义无参数宏定义的一般表达形式为:#define标识符字符串例如,定义圆周率л,可以使用下面的宏定义:#definePI3.14定义上述宏PI后,程序在预处理时将代码中所有的PI都替换成3.14来处理。例如程序中有如下代码:S=PI*r*r;则系统在程序预处理时将上述代码更改为:S=3.14*r*r;12.1.1什么是宏定义2.嵌套宏定义宏定义允许嵌套定义,即在前面定义的宏可以作为字符串应
3、用于后面的宏。例如,可以将圆面积的计算定义成宏:#definePI3.14#defineSPI*r*r若程序中存在代码:r=10;printf(“圆面积S=%f”,S);系统在预编译时将第二行语句中S替换为:printf(“圆面积S=%f”,PI*r*r);由于PI也是宏定义,因此系统将继续作替换工作:printf(“圆面积S=%f”,3.14*r*r);12.1.1什么是宏定义3.有参宏定义有参宏定义的一般表达形式为:#define标识符(参数表)字符串其中,参数表按照程序代码中的参数指
4、示进行替换,例如,计算长为a宽为b的长方形周长,可以定义宏:#defineL(a,b)2*((a)+(b))若程序中有如下代码:Perimeter=L(8,4.5);系统预编译时时首先执行第一步替换:Perimeter=2*((a)+(b));然后执行第二步替换:Perimeter=2*((8)+(4.5));需要注意的是,宏名L和参数表列之间不应该有空格,如:#defineL(a,b)2*((a)+(b))这样定义时,程序代码预编译时被替换为:Perimeter=(a,b)2*((a)+(b))(8
5、,4.5);这显然是不正确的代码格式,程序在编译时将报告错误。12.1.1什么是宏定义带参数的宏类似于函数调用,但与函数调用有本质的区别,主要区别如表所示。宏定义时应注意的规则有:(1)通常将宏名使用大写字母表示。(2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。(3)预处理是在编译之前的处理,而程序编译的一个主要功能是语法检查,因此,系统不对宏定义做语法检查。(4)宏定义由#define命令表示,末尾不加分号。(5)宏定义不属于任何函数,因此,应将宏定义写在函数外边,作用
6、范围为从定义开始以后的程序。(6)宏定义允许嵌套定义。(7)与变量定义不同,宏定义不分配内存空间,仅是代码的替换。(8)C语言允许定义相同名称的宏,但必须参数不相同。功能对比函数宏参数传递方式实参到形参为单向值传递实参的字符串替换形参处理时间及内存分配程序运行时处理,为函数内的数据分配临时内存单元。预编译时进行宏展开处理,不分配内存参数类型实参和形参类型一致字符串替换,不考虑参数类型返回值可以有一个返回值对应不同参数,可以有多个返回值对源代码的影响不影响源代码预编译执行宏展开后使程序加长时间占用量占用
7、程序运行时间不占用运行时间,仅占用编译时间12.1.2宏定义的应用1.常量的宏定义使用宏,我们可以给数值、字符和字符串命名。例如,可以为常量定义宏:#defineARRAY_LEN50#defineFALSE1#defineTRUE0#definePI3.14159#defineLINE_FEED''使用宏定义重命名常量有很多显著的优点:(1)程序易读性强(2)便于维护和修改。范例12.1SphereVAndS.c计算半径为r的球体体积V和表面积S,计算这两个数据值时需要用到圆周率л,л的取值会影
8、响计算结果的精度。将圆周率л定义成宏PI,程序维护时通过修改宏值改变计算结果的精度。12.1.2宏定义的应用2.定义宏作数组维数通常,定义数组时要指定数组的维数,但很多情况下,使用数组表示数组维数让人很难理解数组长度的含义,此时,可以将数字定义成宏,使用宏名表示数组长度的含义,这样即方便程序后续维护时对数组长度的修改,也便于程序阅读和理解。例如,要定义一个班级内学生的某科成绩,可以定义成下面的宏和数组:#defineSTU_NUM56floatMath_
此文档下载收益归作者所有