c语言程序设计 谭浩强第07章

上传人:zhan****gclb 文档编号:232291956 上传时间:2023-09-16 格式:PPT 页数:19 大小:144KB
返回 下载 相关 举报
c语言程序设计 谭浩强第07章_第1页
第1页 / 共19页
c语言程序设计 谭浩强第07章_第2页
第2页 / 共19页
c语言程序设计 谭浩强第07章_第3页
第3页 / 共19页
点击查看更多>>
资源描述
第第七七章章 编译预处理编译预处理7.1 宏定义宏定义7.2 文件包含文件包含7.3 条件编译条件编译7.4 程序举例程序举例编译预处理编译预处理 C编译系统在对源程序编译之前进行一些预加工,该过程是由预处理程序来完成的。l l作作 用用改善程序设计的环境,有助于编写易移植、易调试的程序。l l三种预处理功能三种预处理功能1.宏 定 义宏定义命令 (#definedefine)2.文件包含文件包含命令(#includeinclude)3.条件编译条件编译命令(#if _ if _ endifendif)预处理命令均以“#”打头,末尾不加分号。7.1 宏定义宏定义格格 式式#define 标识符 字符串 功功 能能 指定一个标识符来代表一个字符串。在进行编译预处理时,编译系统先将程序中出现的标识符,一律用字符串去置换,然后再对置换后的源文件进行编译。宏名宏体说说 明明1.宏名,习惯上使用英文大写字母,以与变量名区别。2.宏体,可以是常量、关键字、语句、表达式或空字符。3.宏定义时不必在行末加“;”,否则连同分号一起置换。7.1.1 7.1.1 不带参数的宏定义不带参数的宏定义l 符号常量符号常量的定义的定义#define PI 3.14#define R 3#define H 4main()printf(圆的面积=%f n ,PI*R*R);printf(球的表面积=%f n ,4*PI*R*R);printf(圆柱的体积=%f n ,PI*R*R*H);经过预处理后经过预处理后printf(圆的面积=%f n ,3.14*3*3);printf(球的表面积=%f n ,4*3.14*3*3);printf(圆柱的体积=%f n ,3.14*3*3*4);l一些经常定义的符号常量一些经常定义的符号常量#define E 2.71828#define PI 3.14159#define TRUE 1#define FALSE 0#define EPS 1.0e-6l使用宏定义时,需注意的问题使用宏定义时,需注意的问题1.预处理时,只作预处理时,只作无智能的简单的替换无智能的简单的替换,不计算也不作语法检查。如果,不计算也不作语法检查。如果预处理命令有错,只能在编译源程序时检查出来。预处理命令有错,只能在编译源程序时检查出来。#define PI 3,141592.一般应把一般应把#definedefine所定义的所定义的表达式字符串表达式字符串用括号括起来,如:用括号括起来,如:#define LEN 3+5 size=LEN*2;printf(“%d”,size);预处理后预处理后(宏展开宏展开):size=3+5*2;#define LEN (3+5)size=LEN*2;printf(“%d”,size);预处理后(宏展开):size=(3+5)*2;3.在宏名中不能出现空格,否则会出现错误的宏展开。如:#define LE N 3+5 系统将认为:宏名 LE 宏体 N 3+54.宏定义仅在其定义行起至文件尾或下一个#undef之间有效。例 宏定义的作用范围。main()#define MAX 100 printf(MAX=%dn,MAX);#define STRLEN MAX+1 printf(STRLEN=%dn,STRLEN);#undef MAX#define MAX 200 printf(NEW MAX=%dn,MAX);printf(STRLEN=%dn,STRLEN);运行结果:MAX=100 STRLEN=101 NEW MAX=200 STRLEN=201#undef 撤销宏定义命令7 7.1.2 .1.2 带参数的宏定义带参数的宏定义格式格式#define 宏名(形参表)宏体#define S(a,b)a*b /*a,b为形参*/main()area=S(3,2);/*3,2为实参*/注:宏体中应该包含在参数表中所指定的参数。如:3*2置换area=3*2说明说明1.为确保带参宏定义在调用过程中不出现二义性,应该把字符序列中出现的形参分别用括号括起来。#define SQR(x)(x)*(x)例如 定义一个宏来计算一个数的平方。#define SQR(x)(x*x)size=SQR(3+5);宏展开:size=(3+5*3+5);3+5 作为实参得 23例 从键盘输入两个整数,把其中大的数值显示出来。(要求利用带参数宏定义编程序)#include stdio.h#define MAX(a,b)(a)(b)?(a):(b)main()int x,y,z;scanf(%d%d,&x,&y);z=MAX(x,y);printf(Max=%d,z);若从键盘输入:3 9宏展开:z=(3)(9)?(3):(9)运行结果:MAX=97.2 文件包含文件包含格格 式式#include 或#include filename功功 能能将一个指定的文件嵌入包含到当前的源文件中。系统对嵌入后的源文件进行整体编译处理。首先在当前目录下查找在指定的标准目录下查找如如#include#include math.h l使用文件包含语句,需注意的问题使用文件包含语句,需注意的问题1.一条文件包含命令只能包含一个指定的文件。2.文件包含可以嵌套。如:file.cfile.c为当前程序为当前程序:#include file1.cmain()int a,b,c;scanf(%d,%d,&a,&b);c=max(a,b);printf(max=%d,c)源程序源程序file1.cfile1.cint max(x,y)int x,y;int z;if(xy)z=x;else z=y;return(z);7.3条件编译条件编译根据给定的条件,来决定源程序的编译范围。即只对源程序中必要的部分进行编译,而对其余部分不进行编译,不产生目标代码。7 7.3.3.1 1#if if#else#else#endifendif命命令令功功 能能如果表达式的值为真(非0),则编译“程序段1”,否则编译“程序段2”。格式格式#if 表达式 程序段1#else 程序段2#endif说说 明明 由于表达式的计算是在程序编译之前进行的,因此表达式中不能出现变量。7 7.3.3.2 2#ifdefifdef与与#endifendif命命令令格式二格式二#ifdef 标识符 程序段#endif功功 能能如果“标识符”,在该文件前面用“#define define 标识符”定义过,则编译“程序段1”,否则编译“程序段2”。格式一格式一#ifdef 标识符 程序段1#else 程序段2#endif例如:#define DEBUG main()#ifdef DEBUG prinrf(Debugging function f1n);prinrf(x=%dty=%dtz=%dn,x,y,z);#endif 7 7.3.3.3 3#ififn ndef def 与与#endifendif命命令令功功 能能如果“标识符”没有用“#define define 标识符”定义过,则编译“程序段”,否则不编译。格式一格式一#ifn n n ndef 标识符 程序段#endif例 输入一行字母字符,根据需要设置条件编译,使之能将字母全改为大写输出或全改为小写输出。#define LETTER 1 main()int i=0;char c ,str20=“CLanguage”;while(c=stri)!=0)i+;#if LETTER if(c=a&c=A&c=Z)c=c+32;#endif printf(”%c,c);/*i+;*/C L A N G U A G E
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!