已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
,第7章,预处理命令,主要内容,7.1 概述 7.2 宏定义 7.3“文件包含”处理,7.1 概述,合理地使用预处理功能可以程序便于阅读、修改、移植和调试,也有利于模块华程序设计。,以“#”号开头的预处理命令,如#include,宏定义命令#define等,这些预处理命令放在函数之外,一般放在源文件的前面,称为预处理部分。,7.2 宏定义,7.2.1 无参宏定义,宏定义一般形式为:,define 标识符 字符串 例如:define PI 3.1415926,宏定义的作用是在本程序文件中用指定的标识符PI来代替“3.1415926”这个字符串,在编译预处理时,将程序中在该命令以后出现的所有的PI都用“3.1415926”代替。这种方法使用户能以一个简单的名字代替一个长的字符串. 这个标识符(名字)称为“宏名” 在预编译时将宏名替换成字符串的过程称为宏替换或宏展开. define是宏定义命令。,【例7.1】 不带参数宏的使用,(1) 宏名一般习惯用大写字母表示,以便与变量名相区别。但这并非规定,也可用小写字母。 (2) 使用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量。 宏定义是用宏名代替一个字符串,只作简单置换,不作正确性检查。如有错误,只能在编译已被宏展开后的源程序时发现。,说明:,(3) 宏定义不是说明或语句,不必在行末加分号。如果加了分号则会连分号一起进行置换。 (4) define命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束。通常,define命令写在文件开头,函数之前,作为文件一部分,在此文件范围内有效。 可以用 undef命令终止宏定义的作用域。,说明:,#define G 9.8 _ void main() G的有效范围 - #undef G f1() ,在f1函数中,不再代表9.8。这样可以灵活控制宏定义的作用范围。,(5) 宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换。,说明:,【例7.2】 #define OK 100 void main() printf(“OK“); printf(“n“); ,(6) 宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名,在宏展开时由预处理程序层层代换。,说明:,例如: # define PI 3.1415926 # define S PI*y*y 对语句 printf(“%f”,S); 在宏替换后变为: printf(“%f”,3.1415926*y*y);,(7) 对“输出格式”作宏定义,可以减少书定麻烦。,说明:,【例7.3】中就采用了(7)那种方法。 #include #define P printf #define D “%dn“ #define F “%fn“ void main() int a=5, c=8, e=11; float b=3.8, d=9.7, f=21.08; P(D F,a,b); P(D F,c,d); P(D F,e,f); ,执行结果: 5 3.800000 8 9.700000 11 21.080000,下面叙述中正确的是( )。 A. 宏定义是C语句,所以要在行末加分号 B. 可以使用#undef命令来终止宏定义的作用域 C. 在进行宏定义时,宏定义不能层层嵌套 D. 对程序中用双引号括起来的字符串内的字符,与宏名相同的要进行置换,B,7.2.2 带参数的宏定义,作用:不是进行简单的字符串替换,还要进行参数替换。,带参数的宏定义一般形式为:,define 宏名(形参表) 字符串,带参宏调用的一般形式为:,宏名(实参表);,其中:,宏名同不带参的宏名,习惯用大写字母。 形参表由一个或多个参数构成,注意形参与函数形参的区别:参数只有参数名,没有数据类型,只作替换,不分配内存空间。,例如: #define M(y) y*y+3*y k=M(5); 在宏调用时,用实参代替形参y,经预处理宏展开后的语句为: K=5*5+3*5,【例7.4】带参宏替换,执行结果: Input two numbers: 8 6 Max=8,(1)带参的宏定义中,宏名和形参表之间不能有空格出现。,说明:,例如: # define MAX(a,b) (ab)?a:b 如果写为: # define MAX (a,b) (ab)?a:b 将为认为是无参定义,宏名MAX代表字符串 (a,b) (ab)?a:b。宏展开时,宏调用语句: max=MAX(x,y); 将变为: max= (a,b) (ab)?a:b(x,y);,(2)函数调用是在程序运行时处理的,为形参分配临时的内存单元。而宏展开则是在编译前进行的,在展开时并不分配内存单元,不进行值的传递处理,也没有“返回值”的概念。 对函数中的实参和形参类型要求一致。而宏名无类型,它的参数也无类型,只是一个符号代表,展开时代入指定的字符串即可。宏定义时,字符串可以是任何类型的数据。 (3)在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。,说明:,【例7.5】表达式作为宏调用的实参,执行结果: Input a number : 5 sq=36,(4)在宏定义中,字符串内的形参通常要用括号括起来以避免出错。在上例中的宏定义中(y)*(y)表达式的y都用括号括起来,因此结果是正确的。如果去掉括号,把程序改为例7.6所示的形式。,说明:,【例7.6】 进行宏替换的一个典型例子,执行结果: Input a number : 5 sq=11,(5)带参的宏和带参函数很相似,但在本质上是不同的,把同一表达式用函数处理与用宏处理两者的结果有可能是不同的。,说明:,【例7.7】带参的函数和带参的宏的区别,执行结果: 1 4 9 16 25,执行结果: 1 9 25,下列程序执行后的输出结果是( )。 #define MA(x) x*(x-1) main() int a=1,b=2; printf(“%d n“,MA(1+a+b); ,8,下列程序执行后的输出结果是( )。 #define MA(x) x*(x-1) main() int a=1,b=2; printf(“%d n“,MA(1+a+b); ,12,以下程序执行的输出结果是( )。 #define MIN(x,y) (x)(y)?(x):(y) void main() int i,j,k; i=10;j=15; k=10*MIN(i,j); printf(“%dn“,k); ,15,下面程序的运行结果是_。 #define N 10 #define s(x) x*x #define f(x) (x*x) main() int i1,i2; i1=1000/s(N); i2=1000/f(N); printf(“%d,%dn“,i1,i2); ,1000,10,其一般形式为: #include “文件名“ 或 #include ,7.3 文件包含,这两种形式是有区别的: 使用尖括号表示在包含文件目录中去查找 (包含目录是由用户在设置环境时设置的),而不在源文件目录去
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 如何管理和领导新生代员工
- 职位评价的方法要素比较法
- 介入是剪水疗的指标与方法
- 巴黎埃菲尔铁塔介绍
- 体检结论健康宣教
- 会计实训报告幻灯片
- 签订分摊协议书
- 经济适用房的转让协议书
- 2025年湘教版七年级地理上册月考考试试题及答案
- 2025年西师版五年级物理上册月考考试试题及答案
- 2025年云南交投集团下属保山管理处收费员等岗位招聘(62人)备考考试题库附答案解析
- 仁爱英语七年级上半期考试试题(含答案)
- 02jrc901b电子海图操作jan中文说明书
- 仓库现场标准PPT图文展示区域划线、目视化看板规范
- 动物局部解剖学后肢演示文稿
- 国家开放大学《人文英语4》边学边练参考答案
- YY/T 0461-2003麻醉机和呼吸机用呼吸管路
- 制造业信息化课程(课件)
- 地铁机电装修工程指南课件
- DB11T 301-2017 燃气室内工程设计施工验收技术规范
- DBJ46-057-2020 海南省建筑钢结构防腐技术标准
评论
0/150
提交评论