- 1、本文档共20页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第十章 编译预处理和动态存储分配 10.1 编译预处理 所谓编译预处理是指,在对源程序进行编译之前,先对源程序中的编译预处理命令进行处理;然后再将处理的结果,和源程序一起进行编译,以得到目标代码。 编译预处理是C语言编译系统的一个组成部分。 编译预处理是在编译前由编译系统中的预处理程序对源程序的预处理命令进行加工。 源程序中的预处理命令均以“#”开头,结束不加分号,以区别源程序中的语句,它们可以写在程序中的任何位置,作用域是自出现点到源程序的末尾。 预处理命令包括执行宏定义(宏替换)、文件包含和条件编译。 一、宏定义 C语言的宏定义分为两种:简单宏定义与带参数的定义。 宏定义的目的是允许程序员以指定标识符代替一个较复杂的字符串。 一、无参宏定义 1.无参宏定义的一般格式 #define 标识符 语言符号字符串 其中:“define”为宏定义命令;“标识符”为所定义的宏名,通常用大写字母表示,以便于与变量区别;“语言符号字符串”可以是常数、表达式、格式串等。 2.使用宏定义的优点 (1)可提高源程序的可维护性 (2)可提高源程序的可移植性 (3)减少源程序中重复书写字符串的工作量 例:输入圆的半径,求圆的周长、面积。要求使用无参宏定义圆周率。 #define PI 3.1415926 /*PI是宏名,3.1415926用来替换宏名的常数*/ #include stdio.h void main() { float r,length,area,volume; printf(Input a r: ); scanf(%f,r); length=2*PI*r; /*引用无参宏求周长*/ area=PI*r*r; /*引用无参宏求面积*/ printf(length=%.2f,area=% , l, area,); } 使用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量,增加程序的可读性,而且用宏名代替不易出错。 编译预处理时,将程序中PI用3.1415926代替,与宏调用的过程相反,这种将宏名替换成字符串的过程称为“宏展开”。 注意: (1)C语言中,用宏名替换一个字符串是简单的转换过程,不作语法检查。若将宏体的字符串中符号写错了,宏展开时照样代入,只有在编译宏展开后的源程序时才会提示语法错误。例如: #define E 2.71828 若把字母8写成B,即: #define E 2.71B2B 预处理时照样替换,而不管其含义是否正确,一直到对宏展开的结果进行编译时,才会产生错误提示。 (2)宏定义命令行放在源程序的函数外时,宏名的作用域从宏定义命令行开始到本源文件结束。 (3)宏名的作用域可以使用#undef命令终止,形式如下: #undef 标识符 (4)宏名一般用大写字母表示,以示与变量区别。但这并非是规定。 (5)宏定义不是C语句,所以不能在行尾加分号。否则,宏展开时,会将分号作为字符串的1个字符,用于替换宏名。 (6)在进行宏定义时,可以引用已定义的宏名 。 (7)对双引号括起来的字符串内的字符,即使与宏名同名,也不进行宏展开。 二、有参宏定义 1.带参宏定义的一般格式 #define 宏名(形参表) 语言符号字符串 ◆形式参数称为宏名的形式参数,简称形参; ◆构成宏体的字符串中应该包含所指的形式参数; ◆宏名与后续圆括号之间不能留空格。 例如,求宏定义形式如下: #define SQ(n) n*n #define AR(a,b) a*b 宏调用: s1=SQ(5) s2=SQ(x+y) a1=AR(5,3) a2=AR(a+b,b+c) 2.带参宏的调用和宏展开 (1)调用格式:宏名(实参表) (2)宏展开:用宏调用提供的实参字符串,直接置换宏定义命令行中、相应形参字符串,非形参字符保持不变。 3.说明 (1)定义有参宏时,宏名与左圆括号之间不能留有空格。否则,C编译系统将空格以后的所有字符均作为替代字符串,而将该宏视为无参宏。 (2)有参宏的展开,只是将实参作为字符串,简单地置换形参字符串,而不做任何语法检查。在定义有参宏时,在所有形参外和整个字符串外,均加一对圆括号。 但对于以下宏调用语句: s=SQ(p+q) /*原意求(p+q)2*/ a=AR(a+b,b+c) /*原意求矩形的面积(a+b)*(b+c)*/ 按照宏展开的规则,从左到右依次替换宏体中的形参,展开为: s=p+q*p+q a=a+b*b+c 注意: #define SQ(n) (n)*(n) #
文档评论(0)