C语言入门基础第20章预处理课件.ppt

C语言入门基础第20章预处理课件.ppt

ID:57057010

大小:124.00 KB

页数:50页

时间:2020-07-30

上传者:U-5649
C语言入门基础第20章预处理课件.ppt_第1页
C语言入门基础第20章预处理课件.ppt_第2页
C语言入门基础第20章预处理课件.ppt_第3页
C语言入门基础第20章预处理课件.ppt_第4页
C语言入门基础第20章预处理课件.ppt_第5页
资源描述:

《C语言入门基础第20章预处理课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

第20章预处理通过本章的学习要掌握以下内容:宏定义的分类;宏对象的执行机制和适用场景;宏函数的执行机制和适用场景;宏函数和函数的区别;条件编译的3种形式;文件包含的使用 20.1宏定义C语言中的所有预处理命令都以‘#’开头。宏定义是预处理指令的一种,以#define开头。它提供了一种可以替换原码中的字符串的机制。预处理过程中,宏调用会被展开为对应的字符串,这个过程称为“宏展开”。根据宏定义中是否有参数,可以将宏定义分为有两种,宏对象和宏函数,下面来对它们详细介绍。宏对象即为无参数的宏定义,也称为宏对象,形式如下所示。#define宏名宏对象体 20.1宏定义在程序中使用被定义的宏名。宏展开时,会将C代码中的所有宏名替换为宏对象体。例如:01#defineSIZE602…03intarray[SIZE]={0};04…预处理后,第3行被替换为:intarray[6]={0}; 20.1宏定义宏函数即有参数的宏定义,也称为宏函数,形式如下:#define宏名(参数列表)宏函数体宏展开时,会将宏名及其调用参数替换为宏函数体,同时将宏函数体中使用的参数置换为传入的参数。例如:01#defineM_PRINT_INT(a){2printf”%d”,a};3}04…05M_PRINT_INT(b);06…预处理后,第5行被替换为printf(“%d”,b); 20.2宏对象在前面的章节中已经涉及了具名常量的使用,具名常量就是宏对象的一种应用。此外,宏对象还有其他应用。本节将先讨论宏对象的使用方式,然后再介绍如何使用宏对象来代替常用字符串,以及如何使用宏对象说明形参属性,同时还将分析宏定义的作用域,最后还将介绍几种常用的C标准定义的宏对象的使用。 20.2.1使用宏对象宏对象的宏名后不带参数。其定义的一般形式为#define宏名宏对象体其中宏名可以为任意字符,甚至C关键字。例如:#defineintiii那么该程序中的关键字int都将无效,因此会被替换为int。千万不要使用C关键字作为宏名。宏定义中的宏对象体可以为任意字符的集合,一般是宏名后同一行内的所有内容。例如:#defineAAA3;4; 20.2.1使用宏对象此时,程序中的所有AAA都被替换为“3;4;”。所以,如下形式的具名常量的宏定义是错误的。#defineSIZE=4宏展开时,SIZE会被替换为“=4”,而不是4。有的程序中,为了提高程序可读性,宏对象体需要包含多行内容,可以使用分行符‘’将多行程序联接处理成一行语句。例如:#defineHELLO_WORLDprintf(“hello”);printf(“world! ”) 20.2.2代替常用字符串宏对象不仅可以作为具名常量来代替常量,还可以使用简单的字符来代替一些常用的固定代码,以方便代码的书写。下面来讨论使用宏对象的几个问题。 20.2.2代替常用字符串1.简化书写对于一些较长但比较固定的语句,可以使用宏对象来简化它们的书写。例如,在一个程序中,为了美化程序的输出,需要频繁地输出分割线,实现语句如下:printf(“---------------------------------------------------------------------------------- ”);此时,便可以使用一个书写简单的宏对象来代替该语句。如下:#definePRI_DIVISIONprintf(“------------------------------------------------------------------------------------- ”)在程序中,只需调用PRI_DIVISION即可实现输出分割线的功能,大大简化了程序书写。 20.2.2代替常用字符串2.改变输出结构70年代时,贝尔实验室的SteveBourne为了使C程序的语法结构具有显式的结束语句,使用了一系列的宏对象来代替C关键字,例如:#defineSTRINGchar*#defineVOIDvoid#defineWHILEwhile(#defineDO){#defineOD;}#defineBEGIN{#defineEND} 20.2.2代替常用字符串这样,就可以使用如下形式来编写代码。VOIDcopy(STRINGs1,STRINGs2)BEGINWHILE*s1DO*s1++=*s2++;ODEND 20.2.2代替常用字符串宏展开后的C代码如下所示。intcopy(char*s1,char*s2){while(*s2){*s1++=*s2++;}}提示:当时很多人受SteveBourne的影响使用了这种风格的C语言,但是这种写法完全改变了C程序的结构,不具可读性,后来被逐渐淘汰。以上的例子只是为了展示宏对象的强大作用,不推荐使用。 20.2.2代替常用字符串3.不要使用宏对象来简化数据类型的书写在以上讨论的第二点中,使用宏对象定义数据类型的做法是危险的。例如,按照以上的规则要声明两个字符串变量,可以如下所示。STRINGa,b;将代码宏展开,可以得到:char*a,b;实际上,这行代码无法得到两个字符串变量。它只将a定义为字符串变量,b只被定义为字符变量。若要简化数据类型的书写,应当使用typedef来实现,如下所示。typedefchar*STRING;STRINGa,b; 20.2.2代替常用字符串此时,a和b都为字符串变量。宏对象只是简单的字符串代换,是在预处理时完成的。而typedef是在编译时处理的,它不是作简单的代换,而是对类型说明符重新命名。被命名的标识符具有类型定义说明的功能。注意:使用typedef简化数据类型的书写,而不是使用宏对象。 20.2.3说明形参属性一个函数形参列表中的参数按用途可以分为两种:一种用于传入初始值,另一种用于带回函数结果。很多情况下,这两种参数会在形参列表中共存。如果使用变量名来显示它们的区别,会增加变量名长度。这时便可以借助一个宏对象体为空的宏对象来辅助说明参数属性,例如: 20.2.3说明形参属性01#defineIN/*宏定义IN*/02#defineOUT/*宏定义OUT*/0304intcopy_array(/*copy_array函数声明*/05INint*source,/*输入的参数*/06INintm;/*输入的参数*/07OUTint*destination,/*输出的参数*/08OUTint&n);/*输出的参数*/0910intget_by_index(/*copy_array函数声明*/11INint*array,/*输入的参数*/12INintsize,/*输入的参数*/13INintindex,/*输入的参数*/14OUTint&result);/*输出的参数*/ 20.2.4宏定义的作用域宏定义和变量一样也具有作用域,一般情况下,其作用域为本文件中从被定义的语句开始一直到该文件结束。在其作用域外使用,程序将报错。但是,与全局变量类似,可以通过文件包含的方式来扩大宏定义的作用域。因此,对于常用的宏定义,一般都写在头文件中,当源文件需要使用时,只需包含该头文件即可。C语言还提供了一个预处理指令来结束宏定义的作用域,其形式如下:#undef宏名该语句将取消宏定义,在该语句后不能再使用该宏名,除非重新对其进行宏定义。 20.2.5标准宏对象C标准定义了一些宏对象,这些宏的名称都为大写字符,且以“__”开头和结尾。它们可以被#undef,也可以被重定义。常用的标准宏对象有以下几个:__LINE__:当前语句所在的行号,值为10进制整数。__FILE__:当前源文件的文件名,值为字符串常量标注。__DATE__:程序被编译的日期,以“Mmmddyyyy”格式的字符串标注。__TIME__:程序被编译的时间,以“hh:mm:ss”格式的字符串标注。 20.3宏函数宏函数是宏定义的另一种常用方式。宏对象可以实现字符串替换,而宏函数可以实现与函数类似的参数替代。它的功能比宏对象强大的多。本节将先介绍宏函数的使用方式,再比较并总结宏函数与函数的异同点。 20.3.1使用宏函数宏函数是指使用宏定义实现的函数,宏函数的形式如下所示。#define宏名(参数列表)宏函数体其调用表达式为:宏名(参数列表) 20.3.1使用宏函数宏展开后,程序中的宏函数调用表达式都被宏函数体代替。宏名后的左括号必须紧靠宏名,否则会被识别为宏对象,例如:#defineMIN(x,y)(x#include“文件名” 20.5.1使用文件包含文件包含语句的作用是在编译前,使用指定文件名的文件内容替代该#include语句。执行替换前,需要先查找该文件的位置。如前所示,#include命中的文件名可以放在尖括号中,也可以放在双引号内。如果使用尖括号,系统则使用标准查找方式,从C标准库文件所在的目录中寻找;如果使用双引号,系统则会先在用户当前目录中寻找要包含的文件,若找不到,再按标准方式在标准目录中查找。 20.5.2重复包含和循环包含由于文件允许被多次包含和嵌套包含,因此很可能会导致一个文件被重复多次包含,甚至循环包含。 20.6综合练习1。使用宏对象设计printf函数的如下输出格式:一行内输出2个整数;一行内输出2个字符;一行内输出1个整数和1个字符。【提示】为printf的字符串格式定义几个相应的宏对象。 20.6综合练习2。使用条件编译来实现字符大小写的转换函数,要求有两个版本,一个为都转换为大写,一个为都转换为小写。【提示】找出两个功能函数的不同点,将这些地方进行条件编译。

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭