第9章 2014编译预处理.pptVIP

  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文档。上传文档
查看更多
第9章 2014编译预处理

C语言源程序的处理过程: C源程序-编译预处理-编译-连接-执行。 合理使用编译预处理功能有利于程序的阅读、修改、移植和调试。 编译预处理命令以“#”开头,包括:宏定义、文件包含和条件编译。 通过“学生信息管理系统”中头文件的编写实例,领会编译预处理命令的作用。 9.1 宏定义 9.1.1 无参数的宏定义 9.1.2 有参数的宏定义 9.2 文件包含 9.3 条件编译 本章内容 【学习目标】 掌握带参数和不带参数的宏定义命令 掌握文件包含命令 了解条件编译命令 9.1宏定义 分为无参数的宏定义和有参数的宏定义两种。 9.1.1 无参数的宏定义 在源程序中,用户可以定义一个标识符来表示一个字符串,其一般格式如下: #define 宏名 字符串 例如:#define PI 3.14159 前面章节中使用过的符号常量EOF和NULL,在VC 6.0的stdio.h头文件中定义如下: #define EOF (-1) #define NULL 0 【例9-1】计算圆的周长和面积,用无参数的宏定义实现。 #include stdio.h #define PI 3.14159 void main() { double c,r,s; printf(输入圆的半径:); scanf(%lf,r); c=2*PI*r; s=PI*r*r; printf(圆的周长为:%7.2lf\n,c); printf(圆的面积为:%7.2lf\n,s); } 在程序正式编译之前,所有出现PI的地方都用“3.14159”来展开,进行宏替换后的结果如下: #include stdio.h void main() { double c,r,s; printf(输入圆的半径:); scanf(%lf,r); c=2*3.14159*r; s=3.14159*r*r; printf(圆的周长为:%7.2lf\n,c); printf(圆的面积为:%7.2lf\n,s); } 使用宏定义有以下好处: ① 宏名PI有特定的含义,更符合人们的习惯,程序的可读性更强。 ② 使用和修改方便。 如果在程序中几十次用到了PI,现需要将PI的值修改为3.1415926,则只需要修改宏定义即可。 #define PI 3.1415926 宏名PI是一个符号常量,不允许在程序中对其赋值。 例如,如果程序中包含下面的语句,则编译时会出错。 PI=3.14; 9.1.2 有参数的宏定义 有参数的宏定义是指宏名的后面带有参数,其定义的一般格式如下: #define 宏名(形参列表) 字符串 在编译预处理时,不仅要对宏名进行展开,而且展开时要用实参去替换对应的形参。 【例9-2】定义一个求两数最小值的宏,并在程序中加以调用。 上面的源程序进行宏替换后的结果如下: #include stdio.h void main() { printf(MIN(6,9)=%d\n, ((69)?(6):(9))); printf(MIN(7.1,5.9)=%f\n, ((7.15.9)?(7.1):(5.9))); printf(MIN(a,d)=%c\n, ((ad)?(a):(d))); } #include stdio.h #define MIN(a,b) ((ab)?(a):(b)) void main() { printf(MIN(6,9)=%d\n, MIN(6,9)); printf(MIN(7.1,5.9)=%f\n, MIN(7.1,5.9)); printf(MIN(a,d)=%c\n, MIN(a,d)); } 求两数的最小值可以采用函数来实现,为什么要采用宏定义呢? 采用宏定义有以下好处: (1) 宏定义无类型要求,宏名和参数都没有类型,这样求两数的最小值只需要定义一个宏即可。如果采用函数来实现,由于函数的实参和形参类型要一致,因此,整型、实型、字符型需要分别定义一个函数。 (2) 宏替换只是进行简单的字符替换,不占用运行时间,程序的执行效率高。而函数调用是在程序运行时进行的,需要经过复杂的处理过程。 有参数的宏定义中,整个宏体和每个形参最好都用圆括号括起来,以避免替换时出错。 例如,如果将例9-2中的宏定义改成: #define MIN(a,b) ab?a:b 则下面语句的执行结果是11吗? printf(%d\n,5+MIN(6,9)); 不是。因为该语句展开后的结果如下: printf(%d\n,5+69?6:9); 相当于 printf(%d\n,119?6:9); 所以,输出结果为9。 【例9-3】演示在宏定义的字符串中使用已经定义过的宏名。

文档评论(0)

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

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

版权声明书
用户编号:7014141164000003

1亿VIP精品文档

相关文档