




已阅读5页,还剩20页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第九章,条件编译,回顾,指针是一个变量,它存储另一个对象的内存地址指针的声明由基本类型、星号(*)和变量名组成为指针赋值,赋值运算符右侧必须是一个地址。如果是普通变量需要在前面加一个取地址运算符(2)在不带参数的宏定义中像a,b,x,y必须先预定义后才能在后面的宏定义中使用,即宏定义可以嵌套,宏定义的字符串中可以使用已定义的宏名,在宏展开时由预处理程序层层代换;例如:#definea1.2#defineb2.4#defines2a*b(3)在宏定义中,符号常量一般大写,本例中有大写也有小写。(4)编译器在编译之前把程序中出现的一切宏用其对应的表达式字符串来替代,而不是计算表达式的值后才替代,即宏定义是用宏名表示的一个字符串,在宏展开时又以该字符串取代宏,这只是一种简单的代换,字符串可以含有任何字符,可以是常量,也可以是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时才发现。,9.1宏定义,(5)在#define语句中,宏与字符串之间用空格隔开,在表达式末尾没有分号,不然分号也会被认为是表达式的一部分而出现在程序中宏出现的位置。(6)如果在双引号中的字符串中出现宏名,则此字符串中的和宏名相同的字符是普通字符不会被替换。例如:printf(“矩形的面积s2=%lfn”,s2);该语句中的第1个s2就不会被替换。另外对“输出格式”作宏定义,可以减少书写麻烦,但可读性差。例如:#include#definePprintf#defineD“%dn”#defineF“%fn”voidmain()inta=1,c=2;floatb=1.2,d=2.4;P(DF,a,b);P(DF,c,d);,9.2带参数的宏定义,语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。带参宏定义的一般形式为:#define宏名(形参表)字符串在字符串中含有各个形参。带参数的宏调用的一般形式为:宏名(实参表);例如:#defineS2(a,b)(a)*(b)/*宏定义*/printf(“矩形的面积S2=%lfn”,S2(1.2,2.4);/*宏调用*/在宏调用时,用实参1.2和2.4去代替形参a,b,经预处理宏展开后的语句为:printf(“矩形的面积S2=%lfn”,1.2*2.4);,例9.2,对于带参数的宏定义有以下问题需要说明:(1)带参宏定义中,宏名和形参表之间不能有空格出现。例如:#defineS2(a,b)(a)*(b)写为:#defineS2(a,b)(a)*(b)将被认为是无参宏定义,宏名S2代表字符串(a,b)(a)*(b)。宏展开时,宏调用语句成为:s20=(a,b)(a)*(b)(a,b);这显然是错误的。(2)在带参宏定义中,形式参数不分配内存单元,因此不必作类型定义。这与函数调用中的情况是不同的。在函数调用中,形参和实参是两个不同的量,各有自己的作用域,调用时要把实参值传递给形参,进行“值传递”。而在带参宏中,只是符号代换,不存在值传递的问题。(3)在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。,宏定义还可以解除,解除宏定义的一般形式为:#undef宏名其中,#undef是关键字,宏名是在此前定义过的。功能是解除前面已定义的宏,使之不再起作用,也就是说宏有它的作用域。,9.2文件包含,文件包含是C预处理程序的另一个重要功能。文件包含命令行的一般形式为:#include或#include“文件名”在前面我们已多次用此命令包含过库函数的头文件。例如:#include#include在VisualC+6.0中,系统含有的头文件用两种形式都可以,自定义的头文件用#include形式时第一次编译可能无法通过。如果不能通过请修改为#include“文件名”形式。文件包含命令的功能是把指定的文件插入到该命令行位置取代该命令行,从而把指定的文件和当前的源程序文件连成一个源文件。文件包含命令的几点说明如下。(1)一个#include命令只能指定一个被包含文件,若有多个文件要包含,则需用多个#include命令。(2)被包含文件的扩展名可以不是.h的文件。(3)文件包含允许嵌套,即在一个被包含的文件中又可以包含另一个文件。,例9.3,9.3条件编译,预处理程序提供了条件编译的功能。可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。这对于程序的移植和调试是很有用的。条件编译有三种形式:1.第一种形式。#ifdef标识符程序段1#else程序段2#endif它的功能是,如果标识符已被#define命令定义过则对程序段1进行编译;否则对程序段2进行编译。如果没有程序段2(它为空),本格式中的#else可以没有,即可以写为:#ifdef标识符程序段#endif,例9.4,例9.5,总结,(1)预处理功能是语言特有的功能,它是在对源程序正式编译前由预处理程序自动完成的。(2)宏定义是用一个标识符来表示一个字符串,这个字符串可以是常量、变量或表达式。在宏展开中将用该字符串代换宏名。宏定义可以带有参数,宏调用时是以实参代换形参,而不是“值传送”。为了避免宏代换时发生错误,宏定义中的字符串应加括号,即字符
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 衡器装配调试工团队目标认同度考核试卷及答案
- 锚链热处理工心肺复苏认证考核试卷及答案
- 离婚协议书违约责任范本
- 金属挤压工新生代员工管理考核试卷及答案
- 锁零件制作工沟通考核试卷及答案
- 2025中外合资公司劳动合同模板示例
- 四川省甘孜市2026届数学八年级第一学期期末统考模拟试题含解析
- 2025年建筑工程施工人员劳动合同
- 2025合同范本租赁合同(标准文本)样本
- 2025房屋买卖合同协议书范文
- GB/T 20863.2-2025起重机分级第2部分:流动式起重机
- 仓库安全培训课件
- 算力:新质生产力的核心引擎
- 学生历史思维品质提升策略浅识
- 《创伤失血性休克中国急诊专家共识(2023)》解读 2
- 项目部领导带班记录
- 2025年中国心力衰竭诊断和治疗指南
- 生产企业退货管理办法
- 高速公路工作人员安全教育培训
- 汽车废电池管理制度
- JG/T 368-2012钢筋桁架楼承板
评论
0/150
提交评论