第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); } 函数与宏的区别 在使用宏时,始终应当牢记:无论是否是带参数的宏定义,在程序编译进行宏展开时
您可能关注的文档
- 第8章对话框和控件.ppt
- 第8章城市及乡村经济.ppt
- 和孩子们一起成长.ppt
- 第8章工业结晶过程与设备.ppt
- 第8章23光敏传感器100601.ppt
- 第8章光电式、光纤、红外及其他传感器.ppt
- 第8章工程费用效益分析.ppt
- 和谐中国,发展中.ppt
- 和谐健康之尊防癌保险2014.1.28【终稿】.pptx
- 和田玉销售技巧.ppt
- (2026春新版)部编版八年级语文下册《第一单元》PPT课件.pptx
- 2018电力监控系统网络安全监测装置技术规范.docx
- 2022电力监控系统安全防护方案审核要点.docx
- 2014电力电缆光伏系统EN 50618欧标.docx
- (2026春新版)人教版二年级数学下册《第三单元 万以内数的认识》教案.docx
- (2026春新版)人教版二年级数学下册《第四单元 万以内的加法和减法》教案.docx
- (2026春新版)人教版二年级数学下册《综合与实践 时间在哪里》教案.docx
- (2026春新版)苏教版二年级数学下册《综合与实践 时间有多长》教案 .pdf
- (2026春新版)部编版三年级语文下册第3单元(教案).docx
- (2026春新版)部编版三年级语文下册第8单元(教案).docx
最近下载
- 医院体检报告改用简单.pdf VIP
- 人工气道气囊的管理专家共识(2024完整版).pptx VIP
- 2026年部编版新教材道德与法治小学三年级下册全册教案(含教学计划).docx
- 外研版(2025)高中英语必修选择性第一册单词表(全) .pdf VIP
- 上海新国际博览中心有限公司.PDF VIP
- 2026元旦主题班会:马年猜猜乐,猜成语 (共130题) 课件(共134张PPT).pptx VIP
- 锚定新坐标,聚力新征程——学校2026年工作思路(6大板块+28项核心举措).doc VIP
- 《爷爷的爷爷从哪里来》整本书阅读课件四年级下册语文(统编版).pptx VIP
- 山东省东营市广饶县2024-2025学年八年级(五四学制)下学期期末考试化学试卷(含答案).docx VIP
- 2025年事业单位招聘考试财会类综合知识试卷.docx VIP
原创力文档

文档评论(0)