- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第8章结构体与共用体讲解
一、不带参数的宏定义 不带参数的宏定义:用一个指定的标识符来代替一个字符串。其一般形式: #define 标识符 字符串 如: #define PI 3.14159 则在以后程序中标识符PI用来表示3.14159,如果有语句 area=PI*3*3; 则该语句在编译时将被替换为 area=3.14159*3*3; *标识符“PI”被称为“宏名”,这个替换过程称为“宏展开”。#define语句被称为宏定义。 *注意,不能将宏定义写成#define PI=3.14159 宏名一般用大写字母,以区别于普通的变量 。 宏替换过程只是简单的字符串替换,并不做语法检查。 宏定义一般不在行末加分号,若有分号,则一起参加替换。如,若有定义: #define PI 3.14159; 则对于程序中的语句: area=PI*3*3; 将被展开为:area=3.14159;*3*3; 宏名的作用范围从定义之处起到本文件结束。若要终止其作用域,可使用#undef命令。 说明: 在进行宏定义时,可以引用已定义的宏名,即宏可以嵌套定义。如: #define PI 3.1415 #define R 3.0 #define L 2*PI*R #define S PI*R*R main( ) { printf(L=%f\n=%f\n,L,S); } 用双引号括起来的字符不进行替换,如上例。 L=2*PI*R=2*3.1415*3.0 二、带参数的宏定义 带参数的宏定义:在替换字符串的同时进行参数替换 。其一般形式: #define 标识符(参数列表) 字符串 其中字符串中包含括号中指定的参数列表。 如: #define S( a , b ) a*b 则在以后程序中如果出现语句 area=S ( 3.0 , 2.4 ) ; 则该语句在编译时将被替换为 area= 3.0 * 2.4; 带参数的宏在进行宏展开时,和函数的调用很相似。如下例所示: 求圆的面积 : #define PI 3.14159 #define S(r) PI*( r )*( r ) main() { printf(“圆的面积为:%f”,S(3.6) ); } 求两数中的较大者,可以用宏来实现为: #define max(x , y) ( ( x ) ( y ) ? ( x ): ( y )) main( ) { int a=5,b=8,c; c=max(a,b); ……} 在以上两例中,之所以要把宏定义中的参数用括号括起来(而在函数中,参数是不用括号括起来的),是因为带参数的宏不同于函数: 函数调用时先求解实参表达式的值,然后代入形参;而使用带参数的宏只是进行简单字串替换。如对于上例,若将宏定义为: #define S( r ) PI * r * r 则对于语句 area=S(3+1); 将被宏展开为 area=3.14159* 3+1* 3+1 ; 显然这不是编程者所期望的。更加危险的是:对于这种“错误”,C编译器并不报告,而且结果也和正确结果相差不多,大大增加了排错的难度。 函数与宏的区别 函数名与括号之间可插入有空格,而带参数的宏名与括号之间则不能有空格。因为空格将作为宏名的结束标记。如,若有宏定义: #define S ?(r) PI * r * r 则对于语句 area=S(a); 进行宏展开后为 area=(r) PI*r*r(a); 函数必须有类型,而宏则无类型问题,只是进行字符串替换。 宏展开不占运行时间,只占编译时间,而函数调用占运行时间。因此,使用宏可以比函数调用更快。 函数与宏的区别 函数只能有一个返回值,而合理利用宏则能得到多个值。如下例: #define PI 3.14159 #define CIRCLE(R,L,S,V) L=2*PI*R;S=P1*R*R;V=4/3PI*R*R*R; main() { float r,l,s,v; r=3.6; CIRCLE(r,l,s,v); printf(“r=%f,l=%f,s=%f,v=%f”,r,l,s,v); } 函数与宏的区别 在使用宏时,始终应当牢记:无论是否是带参数的宏定义,在程序编译进行宏展开时
文档评论(0)