c语言课件 第七章 编译预处理_第1页
c语言课件 第七章 编译预处理_第2页
c语言课件 第七章 编译预处理_第3页
c语言课件 第七章 编译预处理_第4页
c语言课件 第七章 编译预处理_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

1、1 第七章 编译预处理2预处理与编译过程图编译程序不能识别预处理命令!源程序源程序(含预处(含预处理命令)理命令)预处理器预处理器源程序源程序(不含预处(不含预处理命令)理命令)编译器编译器目标目标代码代码按预处理命令对程序按预处理命令对程序进行文本替换等处理进行文本替换等处理3提纲o 概述o 宏定义n 不带参数的宏n 带参数的宏n 取消宏定义o 文件包含o 练习4预处理命令o 以“#”开头,作为预处理命令的标志o 以回车符结束(不是“;”)o 不同于语句,在程序正常编译之前被处理o 三种常用的预处理命令n 宏定义命令n 文件包含命令n 条件编译命令57.1 宏定义o 文本替换o #defin

2、eo 带参数的宏o 不带参数的宏67.1.1 不带参数的宏o 作用:用一个指定的标识符来代表一个字符序列,即定义符号常量。o 宏定义形式:#define 标识符 字符序列n 标识符称为“宏名”,一般习惯用大写字母表示7宏替换o 在预处理过程中将宏定义之后的所有宏名逐一替换成相应的替换文本,这一过程称为“宏展开”或 “宏替换”。o 例:#define PI 3.14159s = PI * r * r;经宏替换为:s = 3.14159 * r * r;8宏替换常见错误o 例:#define PI 3.14159;s = PI * r * r;o 经宏替换为:s = 3.14159; * r *

3、r;o 说明:宏定义不是C语句,不必在行末加分号,宏定义以“回车”结束。9宏替换常见错误o 例:#define PI = 3.14159s = PI * r * r;o 经宏替换为:s = =3.14159 * r * r;o 宏定义是用宏名代替一个字符序列,所以是作简单的置换,不作正确性检查。10宏替换o 例:#define LONG_STRING this isnot a very long stringo 一般单独占一行。如写成多行,要加续行符“”。11宏替换o 例:#define HI helloprintf(“HI”);o 字符串和注释中与宏名相同的字符串不进行宏展开。12宏替换o

4、例:#define X 5#define Y X + 1#define Z Y * Xa = Z; o 经宏替换为:a = 5 + 1 * 5;o 在进行宏定义时,可以引用已定义的宏名,即允许嵌套使用宏。13不带参数的宏o 宏定义并不为宏名分配内存空间。o 可以没有替换文本14使用无参宏定义的好处1、提高程序的可读性2、不仅可以减少程序中重复书写某些字串的工作量,而且修改起来也更方便157.1.2 带参数的宏o 定义形式:#define 宏名(参数表) 字符序列o 调用形式:宏名(实参表) o 对带参数的宏进行宏展开的过程n 程序中宏定义之后出现的宏名将按#define命令行中指定的字符序列从

5、左到右进行置换。n 字符序列中的宏形参,将以程序中对应的宏实参替代。16示例o #define PM(x, y) x*yint a=1, b=2, c;c=PM(a+b, a-b);o 宏扩展的结果:c=a+b*a-bc的值为117带参数的宏(2)o 带参数的宏使用过程中容易出现两种错误n 没有对宏字符序列中参数加括号,而出现表达式运算次序不符合意愿的结果n 在宏名和带参数的括弧之间多加了空格。例如:#define S (r) PI*r*r18示例o #define MAX(x, y) (x)(y)?(x):(y)o int max(int x, int y) return x y ? x:y

6、;19宏和函数的区别o 函数调用先求出实参表达式值再带入形参;而带参数的宏则只进行单纯的文本替换。o 函数调用在程序运行时处理,分配临时内存单元;而带参数的宏则不会。o 函数中实参和形参之间类型要赋值相容;而宏不要求。o 使用宏的次数多时,宏展开后源程序长,但是运行时间短;使用函数的次数多时,效果恰好相反。20P191 例7.1.1# include # define MAX(x,y) (x)(y)?(x):(y)int max(int x, int y) return xy?x:y ;void main()int a=10, b=20; float x=3.14, y=31.5;printf

7、(%dn,MAX(a,b); printf(%fn,MAX(x,y); printf(%dn,max(a,b);printf(%dn,max(x,y);printf(%fn,max(x,y); 运行结果如下:2031.500020310.000021P192 例7.1.2# include # define CUBE(x) (x)*(x)*(x)int cube(int x) return x*x*x ;void main()int a=2, b;b=CUBE(a+);printf(%dn,b);b=CUBE(a);printf(%dn,b);a=2;b=cube(a+);printf(%dn

8、,b);b=cube(a);printf(%dn,b); 被扩展为(a+)*(a+)*(a+) 8125函数调用 827227.1.3 取消宏定义o #define命令一般放在源文件的首部,宏名的有效范围是定义命令之后直到该源文件结束。o 可以使用#undef命令终止宏定义的作用域。o 形式:#undef 宏名o 使用#undef的主要目的是把宏名局部化。237.2 条件编译(*考试不作要求)#ifdef 宏名 语句块1#else语句块2#endif#ifdef 宏名 语句块1#endif24#ifndef 宏名 语句块1#else语句块2#endif#ifndef 宏名 语句块1#endif

9、25#if 常量表达式语句块1#else语句块2#endif#if 常量表达式语句块1#endif267.3 文件包含o 所谓文件包含指:一个源文件将另一个源文件的全部内容包含进来。o 两种形式n #include n #include 文件名o 这两种形式的差别:使用不同的搜索路径n 第一种形式采用的搜索路径是C库函数头文件所在的目录n 第二种形式采用的搜索路径是:当前目录+ C库函数头文件所在的目录277.3 文件包含o 通常用于包含头文件(.h)o 文件包含可以嵌套,即被包含文件中还可以包含其他文件。287.4 多文件组织o 当程序很大时,就将一个程序分成几个模块,再通过在主程序中inc

10、lude其他模块组合到一起编译。29必做习题o 一(110)o 二 (14)上机完成30第3题#define MAX(a,b,c) (a)(b)?(a):(b)(c)?(a)(b)?(a):(b):(c)#include int main()float a,b,c;printf(请输入欲进行比较的3个数:n);scanf(%f%f%f,&a,&b,&c);printf(最大的数为%fn,MAX(a,b,c);return 0;31第3题#define MAX(a,b,c) (a)(b)?(a):(b)(c)?(a)(b)?(a):(b):(c)a,b中大者a,b中大者a,b中大者再和c比32第4题#define YEAR(a) (a)%4=0

温馨提示

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

评论

0/150

提交评论