- 1、本文档共46页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
第8章;本章主要内容;;;;;;;在C语言源程序中允许用一个标识符来表示一个字符串,称为“宏”,被称为“宏”的标识符称为“宏名”,#define称为宏定义。;8.2宏定义;#includestdio.h
#definePI3.1415926
voidmain()
{floatl,s,r,v;
printf(inputradius:);
scanf(%f,r);
l=2.0*PI*r;
s=PI*r*r;
v=4.0/3*PI*r*r*r;
printf(l=%10.4f\ns=%10.4f\nv=%10.4f\n,l,s,v);
};(1)宏名一般习惯用大写字母表示,以便与变量名相区别。但这并非规定,也可用小写字母。
(2)使用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量。
(3)宏定义是用宏名代替一个字符串,只作简单置换,不作正确性检查。只有在编译已被宏展开后的源程序时才会发现语法错误并报错。;(4)宏定义不是C语句,不必在行末加分号。如果加了分号则会连分号一起进行置换。
(5)#define命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束。通常,#define命令写在文件开头,函数之前,作为文件一部分,在此文件范围内有效。
(6)可以用#undef命令终止宏定义的作用域。
;例:
#defineG9.8______________
voidmain()↑
{G的有效范围
…↓
}------------
#undefG
f1()
{
…
};(7)在进行宏定义时,可以引用已定义的宏名,可以层层置换。
(8)对程序中用双撇号括起来的字符串内的字符,即使与宏名相同,也不进行置换。
(9)宏定义是专门用于预处理命令的一个专用名词,它与定义变量的含义不同,只作字符替换,不分配内存空间。;#includestdio.h
#defineR3.0
#definePI3.1415926
#defineL2*PI*R
#defineSPI*R*R
voidmain()
{
printf(L=%f\nS=%f\n,L,S);
};8.2.2有参宏定义;8.2.2有参宏定义;8.2.2有参宏定义;#defineN5+6
#defineMN*N
#defineM1(x)x*x
#defineM2(x,y)x*y
voidmain()
{
printf(”%d\n”,M);
printf(”%d\n”,M1(5-2));
printf(”%d\n”,M2(6-1,2-1));
};【例4】分析程序中的for循环执行的次数。
#includestdio.h
#defineN2
#defineMN+1
#defineNUM(M+1)*M/2
voidmain()
{
inti;
for(i=1;i=NUM;i++)
printf(%d\n,i);
};(1)对带参数的宏展开只是将语句中的宏名后面括号内的实参字符串代替#define命令行中的形参。
(2)在宏定义时,在宏名与带参数的括弧之间不应加空格,否则将空格以后的字符都作为替代字符串的一部分。;(1)函数调用时,先求出实参表达式的值,然后代入形参。而使用带参的宏只是进行简单的字符替换。
(2)函数调用是在程序运行时处理的,为形参分配临时的内存单元。而宏展开则是在编译前进行的,在展开时并不分配内存单元,不进行值的传递处理,也没有“返回值”的概念。
(3)对函数中的实参和形参类型要求一致。而宏名无类型,它的参数也无类型,只是一个符号代表,展开时代入指定的字符串即可。宏定义时,字符串可以是任何类型的数据。
(4)调用函数只可得到一个返回值,而用宏可以设法得到几个结果。;(5)使用宏次数多时,宏展开后源程序长,而函数调用不会使源程序变长。
(6)宏替换不占运行时间,只占编译时间。而函数调用则占运行时间(分配单元、保留现场、值传递、返回)。;所谓“文件包含”处理是
文档评论(0)