- 1、本文档共37页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
本章要求:掌握无参数宏和带有参数宏定义和使用方法;掌握文件包含的使用方法;掌握条件编译的使用。本章难点:带有参数宏定义和使用方法本章重点:无参数宏和带有参数宏定义和使用方法第7章编译预处理
第7章编译预处理2第7章编译预处理在C语言源程序中以“#”号开头的预处理命令都放在函数之外,一般都放在源文件的前面,它们称为预处理部分。所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。预处理是C语言的一个重要功能,由预处理程序负责完成。对源文件进行编译时,系统将自动引用预处理程序对源程序中预处理部分作处理,处理完再自动进入对源程序的编译。C语言提供了多种预处理功能,主要有宏定义、文件包含、条件编译。
第7章编译预处理37.1宏定义#defineC语言源程序中用一个标识符来表示一个字符串,称为宏。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。C语言中,“宏”分为有参数和无参数两种。
第7章编译预处理47.1宏定义#define7.1.1无参宏定义一般形式:#define标识符字符串作用是用一个指定的标识符来代表一个字符串。常使用宏定义命令#define定义符号常量,若有如下定义:#definePI3.1415926535用标识符(称为“宏名”)PI来代表字符串“3.1415926535”。在编译预处理中,即以3.1415926535代替源程序中出现的PI(这个过程称为“宏展开”)。如程序中的s=PI*r*r等效于s=3.1415926535*r*r。
第7章编译预处理5说明:(1)标识符(宏名)命名,遵守C语言标识符的命名规则。为便于与一般变量区别,宏名常采用大写字母。(2)宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序层层代换。如例6-1中有定义:#definePI3.1415926#defineSPI*r*r/*PI是已定义的宏名*/在编译预处理时,语句printf(“TheArea=%lf\n”,S);经宏代换后变为:printf(TheArea=%lf\n,3.1415926*r*r);注意:若替换的字符串中含有其它字符(如上题中的r),一般要在引用宏的程序需要定义,否则编译时会出现标识符(变量)未定义的错误。7.1宏定义#define
第7章编译预处理6(3)宏定义是用宏名代表字符串,仅作简单置换,不分配内存空间,编译预处理时不检查语法。只有在源程序被宏展开后,进行编译时才作语法检查。下列的宏定义都不可取:#definePI=3.1415926535/*多了等号*/#definePI3.1415926535;/*多了分号*/上述宏定义对于同一个语句:s=PI*r*r;宏展开后分别为:s==3.1415926535*r*r;s=3.1415926535;*r*r;显然有语法错误!7.1宏定义#define
第7章编译预处理7(4)宏替换只对单独的宏名单词进行,对于括在引号中的字符串不起作用。若有宏定义:#defineMAX500对于下列语句:intMAXICOAT=10;/*MAX不是独立单词,不替换*/printf(“MAX=”,MAX);/*前面的MAX在引号中,不替换;后面的要替换*/(5)宏定义必须写在函数之外,宏名的有效范围为定义命令之后到该源文件结束,也可以使用#undef命令来提前终止宏名的作用域。#defineMAX500┇宏名MAX的有效范围#undefMAX ┇宏名MAX在此处无效7.1宏定义#define
第7章编译预处理8(2)宏定义时,宏名与参数表间不能有空格,否则将作为无参数宏来处理。如:#defineMAX(x,y)xy?x:y则认为MAX为宏名,而(x,y)xy?x:y为替代字符串,则易产生错误。(3)带参数的宏和函数有相似之处,都有形参实参的概念,并要求形参实参数目相同,一一对应。但两者实现的过程是不同的。在带参宏定义中,形式参数不分配内存单元
文档评论(0)