VC++书稿第5章.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
VC书稿第5章

第5章 编译预处理 编译预处理是在编译源程序之前,由预处理器对源程序进行一些加工处理工作,如图5.1所示。所谓预处理器,是包含在编译器中的预处理程序。源程序中的编译预处理命令一律以“#”开头,回车符结束,每条命令占一行,并且通常放在源程序文件的开始部分。 图5.1编译预处理过程示意 编译预处理的作用是将源程序文件中的预处理命令进行处理,生成一个中间文件,编译系统再对此中间文件进行编译并生成目标代码,最后生成的目标代码中并不包括预处理命令。 C++提供的预处理功能主要有三种:宏定义、文件包含和条件编译。 5.1 宏定义 5.1.1不带参数的宏定义 用一个指定的标识符来代表一个字符串,这个指定的标识符称为宏名,格式为: #define 宏名 字符串 宏命令后凡出现宏名的地方均用其对应的字符串来替换,替换的过程称为宏展开。例如,有以下宏命令: #define PI 3.1415926 则PI为宏名,凡在程序中出现宏名PI的地方均用3.1415926替换。 例5.1 不带参数的宏替换。 #includeiostream.h #define PI 3.1415926 void main() { double area,r,peri; cout请输入圆的半径: ; cinr; area=PI* r*r;; peri=2.0*PI*r; cout圆的面积为: areaendl; cout圆的周长为: periendl; } 程序执行后的结果为: 请输入圆的半径: 3↙ 圆的面积为: 28.2743 圆的周长为: 18.8496 在上述源程序编译之前,首先执行预编译命令“#define PI 3.1415926”,将源程序内的所有宏名“PI”都替换成“3.1415926”,然后再执行正常的编译命令,将源程序转换为目标代码。可见,“宏替换”是一种“机械替换”,因为是在编译之前进行,所以不对宏名(PI)替换的对象(3.1415926)作语法检查,此时的“3.1415926”不应该看成是实数类型,而认为是一串普通的字符串常量。 特别注意的是,宏定义语句的行末一般不加分号,因为它仅具有替换功能,并不是具体的代码语句。如果行末有分号,那么分号也属于替换对象的一部分,参与宏名的置换,很容易在置换后编译时发生语法错误。例如上例中如果宏定义行末出现分号: #define PI 3.1415926; 源程序中语句“area=PI*r*r;”经宏展开后变成: area=3.1415926;*r*r; 该语句在随后的编译过程中显然会出现语法错误。 使用宏定义时具体说明如下: (1)宏展开只是一个简单的“机械”替换,不做语法检查,不是一个语句,其后不加分号“;” (2)#define命令出现在函数的外面,其有效范围为定义处至本源文件结束。可以用# undef命令终止宏定义的作用域。例如: (3)在进行宏定义中,可以用已定义的宏名,进行层层置换。 (4)对程序中用双引号括起来的字符串内容,即使与宏名相同,也不进行置换。 例5.2 #includeiostream.h #define PI 3.1415926 #define R 3.0 #define PERI 2.0*PI*R #define AREA PI*R*R void main() { coutPERI=PERI\tAREA=AREAendl; } 程序执行后的结果为: PERI=18.8496 AREA=28.2743 在宏定义“#define PERI 2.0*PI*R”中,包含了另外的宏名“PI”和“R”,置换后宏名“PERI”用字符串“2.0*3.1415926*3.0”替换进源程序中,同样宏名“AREA”也用字符串“3.1415926*3.0*3.0”替换。 在输出语句cout中,双引号内的PERI和AREA直接输出,不进行置换。 5.1.2 参数的宏定义 宏名也可以带参数定义,支持参数替换,其格式为: #define 宏名(参数表) 字符串 例如: #define S(a,b) a*b 这里,参数表中的参数a,b称为宏名的形式参数,源程序语句中的宏名仍使用右端的字符串替换,只不过替换时将字符串中的形式参数用语句中宏名所带的实际参数取代而已。例如若源程序中存在如下的语句: double area; area=S(3,2); 此时,3为a的实际参数,2为b的实际参数,则宏名S(3,2)经预处理后,用字符串3*2替换再进行编译。即S(a,b)等同于a*b,而S(3,2)等同于3*2。 带参数的宏替换过程可描述如下: 按#define命令行中指定的字符串从左至右置换宏名,字符串中的形参以相应的实参代替,字符串中的非形参字符保持不变。 例5.3 已知

文档评论(0)

yan698698 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档