第三版C语言课件讲解第09章+预处理命令.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《第三版C语言课件讲解第09章+预处理命令.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第三 语言 课件 讲解 09 预处理 命令
- 资源描述:
-
1、第九章第九章 预处理命令预处理命令编译预处理:编译预处理:在源程序文件中,加入在源程序文件中,加入“编译预处理命编译预处理命令令”,使编译程序在对源程序进行,使编译程序在对源程序进行通常的编译通常的编译(包括(包括词词法分析、语法分析、代码生成、代码优化法分析、语法分析、代码生成、代码优化)之前)之前,先对,先对这些命令进行预处理,然后将预处理的结果和源程序一这些命令进行预处理,然后将预处理的结果和源程序一起再进行通常的编译处理,以得到目标代码(起再进行通常的编译处理,以得到目标代码(OBJ文文件)。件)。C提供的编译预处理命令提供的编译预处理命令宏命令(宏命令(Macro)文件包含命令(文件
2、包含命令(include)条件编译命令条件编译命令这些命令均以这些命令均以#开头,以区别于语句。开头,以区别于语句。9.1 宏定义宏定义9.1.1不带参数的宏定义不带参数的宏定义一般形式一般形式:#define 标识符标识符 字符串字符串例例:#define PI 3.1415926作用作用:用标识符(称为用标识符(称为“宏名宏名”)PI来代替来代替3.1415926这个字这个字符串,在编译预处理时,将程序中在该命令以后出现的所符串,在编译预处理时,将程序中在该命令以后出现的所有的有的PI都用都用3.1415926代替(这一过程又称为代替(这一过程又称为“宏展开宏展开”)。)。例例9.1#de
3、fine PI 3.1415926main()float l,s,r,v;printf(input radius:);scanf(%f,&r);l=2.0*PI*r;s=PI*r*r;v=4.0/3*PI*r*r*r;printf(l=%10.4fns=%10.4fnv=%10.4fn,l,s,v);说明:说明:1 1)宏名一般习惯宏名一般习惯用大写字母表示用大写字母表示。非强制规定,。非强制规定,也可用小写字母;也可用小写字母;2 2)使用宏定义,可以提高程序的通用性,能作使用宏定义,可以提高程序的通用性,能作到到“一改俱改一改俱改”;3 3)宏定义只作宏定义只作简单的替换简单的替换,不作正
4、确性检查。,不作正确性检查。如果词义或语义错误,只有在编译已被宏展开后如果词义或语义错误,只有在编译已被宏展开后的源程序时才会发现错误井报错。例如:的源程序时才会发现错误井报错。例如:#define PI 3.14l59 把第二个把第二个“1”1”写成写成“l”l”。这样的错误只有。这样的错误只有在编译已被宏展开后的源程序时才会发现错误井在编译已被宏展开后的源程序时才会发现错误井报错;报错;4 4)宏定义不是宏定义不是C C语句,语句,不必在行末加分号不必在行末加分号,如果加了分,如果加了分号,则会连同分号以其进行替换;号,则会连同分号以其进行替换;如:如:#define PI 3.14159
5、26;area=P*r*r;在宏扩展后成为:在宏扩展后成为:area=3.1415926;*r*r;结果,在编译时出现语法错误。结果,在编译时出现语法错误。5)宏名的有效范围为宏名的有效范围为定义命令之后到本定义命令之后到本 源文件结束源文件结束。通。通常,常,#define命令写在文件开头,函数之前,作为文件一命令写在文件开头,函数之前,作为文件一部分,在此文件范围内有效。部分,在此文件范围内有效。6)可以用可以用#undef命令终止宏定义的作用域命令终止宏定义的作用域。这样可以。这样可以灵活控制宏定义的作用范围。灵活控制宏定义的作用范围。7)在进行宏定义时,可以引用已定义的宏名,可以层层置
6、在进行宏定义时,可以引用已定义的宏名,可以层层置换。换。例例9.2#define R 3.0#define PI 3.1415926#define L 2*PI*R#define S PI*R*R main()printf(“L=%fnS=%fn”,L,S);8)对程序中用双括号括起来的字符串内的字符,即使与宏对程序中用双括号括起来的字符串内的字符,即使与宏名相同,也不进行置换;名相同,也不进行置换;9)宏定义是专门用于预处理命令的一个专用名词,它与定宏定义是专门用于预处理命令的一个专用名词,它与定义变量的含义不同,只作字符替换,义变量的含义不同,只作字符替换,不分配内存空间不分配内存空间;9
7、.1.2带参数的宏定义一般形式一般形式#define 宏名宏名(参数表参数表)字符串字符串 字符串中包含在括弧中所指定的参数。字符串中包含在括弧中所指定的参数。例如例如#define S(a,b)a*b arear=S(2,3);其中其中S(2,3)相当与相当与2*3.置换方式置换方式 从左到右进行置换。从左到右进行置换。形参用相应的实参(可以是形参用相应的实参(可以是常量常量、变量变量或或表达式表达式)代替,不是参数字符,则保留。代替,不是参数字符,则保留。例例9.3#define PI 3.1415926#define S(r)PI*r*rmain()float a,area;a=3.6;
8、area=S(a);printf(“r=%fnarea=%fn”,a,area);说明:说明:(1)用宏名后面括号内的用宏名后面括号内的实参字符串原样代替实参字符串原样代替define命令行中的形参命令行中的形参。如果有以下语句:如果有以下语句:area=S(a+b)应当在定义时形式参数外面加一个括弧。应当在定义时形式参数外面加一个括弧。#define S(r)PI*(r)*(r)(2)在宏定义时,在宏名与带参数的括弧之间不应加空在宏定义时,在宏名与带参数的括弧之间不应加空格,否则将空格以后的字符都作为替代字符串的一部分,格,否则将空格以后的字符都作为替代字符串的一部分,S(r)PI*r*ra
9、rea=PI*a+b*a+b注意计算次序注意计算次序参数的宏参数的宏和和函数函数的比较:的比较:类似之处:在引用函数时也是在函数名后的括弧内写类似之处:在引用函数时也是在函数名后的括弧内写实参,也要求实参与形参的数目相等,实参,也要求实参与形参的数目相等,带参的宏定义与函数的区别:带参的宏定义与函数的区别:(1)函数调用时,先求出实参表达式的值,然后代入函数调用时,先求出实参表达式的值,然后代入形参。而使用带参的宏只是进行形参。而使用带参的宏只是进行i简单的字符替换;简单的字符替换;(2)函数调用是在程序运行时处理的,分配内存单元。函数调用是在程序运行时处理的,分配内存单元。而宏展开是在编译时
10、进行的,在展开时并不分配内存而宏展开是在编译时进行的,在展开时并不分配内存车元,不进行值的传递处理,也没有车元,不进行值的传递处理,也没有“返回值返回值”的概的概念;念;(3)对函数中的实参和形参都要定义类型,二者的类对函数中的实参和形参都要定义类型,二者的类型要求一致。不一致,应进行类型转换。而宏不存在型要求一致。不一致,应进行类型转换。而宏不存在类型问题,宏名无类型,它的参数也元类型,只是一类型问题,宏名无类型,它的参数也元类型,只是一个符号代表。个符号代表。调用函数只可得到一个返回值,而用宏可以设法得到调用函数只可得到一个返回值,而用宏可以设法得到几个结果。几个结果。使用宏次数多时,宏展
展开阅读全文