c语言课件53宏定义_第1页
c语言课件53宏定义_第2页
c语言课件53宏定义_第3页
c语言课件53宏定义_第4页
c语言课件53宏定义_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、53用一个指定的标识符(即名字)来代表一个字符串,它的一般式#define 标53用一个指定的标识符(即名字)来代表一个字符串,它的一般式#define 标识字符这就是已经介绍过的定义符号常量,例如 它的作用是在本程序文件中用指定的标识符 来代替“”这个字符串,在编译预处理时,将程序中在该后出现的所有的 都用“”代替。这种方法使用户能以个简单的名字代替一个长的字符串,因此把这个标识符(名字)称“宏名”,在预编译时将宏名替换成字符串的过程称为“宏展开#define 是宏定义命令不带参数的宏定 “ 运 运行结果如下 说明宏名一用大写字母表示,以便与变量名相区别,但并非规定,也可用小写字母使用宏名代

2、替一个字符串可以减少程序中重复书写某些符串的工作量。例如,若不定义 代表,则在程序中替,简单而不易出错,因为记住一个宏名(它的名字往往用容易理的单词表示)要比记住一个无规律的字符串容易,而且在读程序时立即知道它的含义,当需要改变某一个变量时,可以只改变命令行,一改全改。例如,定义数组大小可以用先指定array_size 代表常量1000,因此数组array 的大小为如果需要改变数组大先指定array_size 代表常量1000,因此数组array 的大小为如果需要改变数组大小为 500,只需要改变#define 行这样在程序中所有以array_size 代表的1000 全改为500 了。使用定

3、义,可以提高程序的通用性宏定义是用宏名代表一个字符串,也就是作简单的置换作正确性检查。如果写即把数字 1 写成小写字母 l,预处理时也照样代入,不管是否符合户意愿,也不管含义是否有定义。预编译时不作任何语法检查。只在编译已被宏展开后的源程序时才会发现语法错误并报错宏定义不是 C 不必在行末加分号如果加了分号则连分号一起进行置换。如经过宏展开后,该语句显然出现语法错误#define 命令出现在程序中函数的外面,宏名的有效范围定义命令之后到本源文件结束。通常#define 命令写在文件开头数之前,作为文件一部分,在此文件范围内有效可以用#undef 命令终止宏定义的作用域。例如GvoidG的有效范

4、G由可以用#undef 命令终止宏定义的作用域。例如GvoidG的有效范G由于#undef的作用,使G的作用范围到#undef行终止,因此在f1数中,G 不再代表 9.8。这样可以灵活控制宏定义的作用范围在进行宏定义时,可已定义的宏名,可以层层置换定义已定义的宏名#includeRLSvoid运行结果如下经过宏展开后, 函数中的输出项 被展运行结果如下经过宏展开后, 函数中的输出项 被展开2*3.1415926*3.0,S 展开为f 函数调用语展开为“L=%fnS=%fn, 对程序撇号括起来的字符串内的字符即使与宏名同,也不进行置换。如上面例子中的 个在双撇号内,它不被宏置换,另一个在双撇号外

5、,被宏置换宏定义是专门用于预处理命令的一名词它与定义量的含义不同,只作字符替换,不分配内存空间带参数的宏定义不是进行简单的字符串替换还要进行参数替其定义的一般形式为#define 宏名(参数表)符字符串中包含在括号中所指定的参数。例如定义矩形面积S,a b 是边长。在程序中用了S(3,2)3 分别定义矩形面积S,a b 是边长。在程序中用了S(3,2)3 分别代替宏定义中的形式参数 a、b,即用 3*2。因此赋值语句展开对带参数的宏定义是这样展开置换的在程序中如果有带实参宏(如 S(3,2,则按#define 命令行中指定的字符串从左到右置换。如果串中包含宏中的实参(如 a,b,则将程序语句中

6、相应实参(可以是常量,变量或表达式)代替形参。如果宏定义中的字串中的字符不是参数字符(如 a*b 中的*号则保留。这样就形成置换的字符串,见图 9139带参数#includevoidfloat运行结果如下赋值语句展开后说明运行结果如下赋值语句展开后说明对带参数的宏的展开只是将语句中的宏后面括号内的实字符串代表代替#define 命令行中实参。上面例子中语句中有 在展开时,找到#define 命令行中的S(rS(a)中的实参a 代宏定义中的字符串“PI*r*r”中的实参 r,得到 PI*a*a。这是容易理而且不会发生什么问题的。但是,如果有以下语句这时把实参a+b 代替PI*r*r 中的实参r,

7、成为请注意在 a+b 外面没有括号,显然这与程序设计者的原意不符。原希望得到area=PI*(b)*(b为了得到这个结果,应当在定义时,在字符串中的形式参数外面加个括号。即在对S(a+b)进行宏展开时,将 a+b 代替r,就成个括号。即在对S(a+b)进行宏展开时,将 a+b 代替r,就成了这就达到了目的在宏定义时,在宏名与带参数的括号之间不应该加空格则将空格以后的字符都作为替代字符串的一部分。例如,如果有被认为 S 是符号常量(不带参数的宏名,它代表字符串PI*r*r。如果在程序中有语则被展开area=(r)PI*r*r 显然不对了有些学者容易把带参数的宏和函的确它们之间有一的类似之处,在调

8、用函数时也是在函数名后的括号内写实参,也要实参与形参的数目相等带参数的宏定义与函数是不同主有函数调用时,先求出实参表达式的值,然后带入形参。而用带参数的宏只是进行简单的字符替换。例如上面的 S(a+b),在宏开时并不求 a+b 的值,而只将实参字符“a+b”代替形参 r函数调用是在程序运行时处理的为形参分配临时的内存元。而宏展开则是在编译前进行的,在展开时并不分配内存单元进行值的传递处理,也没有“返元。而宏展开则是在编译前进行的,在展开时并不分配内存单元进行值的传递处理,也没有“返回值”的概念对函数中的实参和形参都要定义类型二者的类型要求一致如不一致,应进行类型转换。而宏不存在类型问题,宏名无

9、类型的参数也无类型只是一个符号代表展开时代入指定的字符串即可宏定义时,字符串可以是任何类型的数据。例如(字符(数值和 a 不需要定义类型,它们不是变量,在程序中凡CHARI 均已CHINA 代之;凡遇a 3.6 代之,显然不需要定义型。同样,对带参数的的宏r 也不是变量如果在语句中有 s(3.6),则展开后为 PI*3.6*3.6,语句并不出现r。当然也不必定义r 的类型调用函数果到一个返回值而用宏可以设法得到几个例 通过宏展开得到若干个结果#include对宏进行预编译,展开后的 main 函数如下对宏进行预编译,展开后的 main 函数如下运行结果如下请注意,只要已知实参r 的值,就可以从

10、宏CIRCLE 的展开中3 个值(l,s,v。其实,这只不过是字符代替而已,将字符r 求出l,s,v 的值使用宏次数多时,宏展开后源程序变长,因为每展开求出l,s,v 的值使用宏次数多时,宏展开后源程序变长,因为每展开一次使程序增长,而函数调用不会使源程序增长宏替换不占运行时间,只占编译时间。而函数调用则占运时间(分配单元,保留现场,值传递,返回一般用宏来代表简短的表达式比较合适。有些问题,用宏和函都可以。例如赋值语句展开后为注意MAX 不是函数,这里只有一个main 函数,在main 函数中求出t的值这个问题也可以用函数来解决。可以定义两个数中大者的函在主函数中调用max 函数请仔细分析以上两种方法如利用宏实现程序的简化在主函数中调用max 函数请仔细分析以上两种方法如利用宏实现程序的简化可以事先将程序的“输出格式”定义好,以减少在输出语句中每次都要写出具体的出格式的麻烦代表输出格式#includefDDDDDDDDDDDS运行时输出以下结果1程序DDDDS运行时输出以下结果1程序中用PR代表f;以上 NL 代表执行一次“换行”操作以D 代表输出一个整型数据的格式符“%dD1 代表输出完1 整数后换行;D2 代表输出2 个整数后换行;D3 代表输出3 个整数换行;D4代表输出4个整数后换行;以S换行;D4代表输出4个整数后换行;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论