第9章 编预处理.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文档。上传文档
查看更多
预处理 ANSI C规定可以在C源程序中加入一些“预处理命令”,以改进程序设计环境,提高编译效率,这些命令是由ANSIC统一规定的,并不是C语言本身的组成部分,不能直接对他们进行编译(编译系统不能识别他们)。 在编译前先对程序中的这些特殊命令进行“预处理”,C提供的预处理功能主要有以下三种 1、宏定义 2、文件包含 3、条件编译,为了与一般C语句相区别,这些命令以“#”开头。 例子 #define PI 3.14159 #include stdio.h void main ( ) { float s,r=4.0; s=PI*r*r; printf(s=%f\n,s); } 在C语言源程序中允许用一个标识符来表示一个字符串, 称为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换, 这称为“宏代换”或“宏展开”。 宏定义是由源程序中的宏定义命令完成的。 宏代换是由预处理程序自动完成的。在C语言中,“宏”分为有参数和无参数两种。 下面分别讨论这两种“宏”的定义和调用。 1. 无参数宏定义符号常量 符号常量用无参数的宏定义语句定义,把符号常量名定义为指定的字符串,将程序中出现宏名的地方均用该字符串来替换。在进行编译预处理时,用该字符串替代程序中出现的符号常量名。例如: #define TRUE 1 #define FALSE 0 把TRUE定义为1,把FALSE定义为0。在符号常量定义之后,就可以用它来编码了。 例如: if(i==TRUE) printf(you are right! \n) ; else if(i==FALSE) printf(you are wrong! \n) ; 对于该程序段,在进行编译预处理时,就把程序中出现的TRUE和FALSE分别用1和0替代,于是就变为 if(i==1) printf(you are right! \n) ; else if(i==0) printf(you are wrong! \n) ; 在符号常量定义语句中,字符串可以是一个数值型数据、表达式或字符串。例如: #define PI 3.1415926 #define S (PI*r*r) #define PRT printf #define A (20-(3*4)) 如果字符串是一个运算表达式,一般应该用括号括住它,以便把它视为一个操作对象与其他操作数进行运算,否则,会由于操作优先级问题而发生错误。例如: text = A*8 ; 进行编译预处理后,该表达式变为 text = (20-(3*4))*8 ; 如果A定义为 #define A 20- (3*4) 则表达式text = A*8经预编译后变为 text = 20- (3*4)*8 ; 这就不符合原意。因此,在宏定义语句中的字符串为一般表达式(而不是一个操作数)时,为了保证正确的运算次序,应该用括号括住它。因此在宏定义时必须十分注意,应保证在宏代换之后不发生错误。 3. 无参数宏的注意事项 使用无参数宏定义符号常量时,一般应注意以下几点。 (1) 宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何正确性检查。如有错误,则只能在编译已被宏展开后的源程序时发现。 (2) 符号常量名一般用大写字母(也可以用小写字母)表示,以便与其他标识符相区别。符号常量名的命名规则与一般标识符相同。另外,应考虑在字符串中根据需要加上括号。 (3) 宏定义不是说明或语句,因此,不能用分号结尾。如果加上分号,则分号被作为字符串的一部分,连分号也一起置换。例如: #define A 60 ; 上面的格式表示A被定义为“60 ;”,而不是“60”。于是,在预编译时,程序中凡是出现A的地方,都用“60 ;”替换。这就不符合原意了。 (4) 替换字符串可以为空。 (5) 宏定义语句应放在函数定义之外,符号常量的有效范围是从定义它的宏定义语句开始至所在源文件的结尾。一般宏定义语句都放在源文件的开头,以便使它对整个源文件都有效。 (6) 为了灵活控制宏定义的作用范围,可用“﹟undef”命令终止宏定义的作用域。 例如: #define PI 3.14159 main( ) { ? } # undef PI /

文档评论(0)

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

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

1亿VIP精品文档

相关文档