欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    第7章编译预处理.ppt

    • 资源ID:75316783       资源大小:687.50KB        全文页数:51页
    • 资源格式: PPT        下载积分:12金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要12金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第7章编译预处理.ppt

    第第7 7章章编译预处理C C/C C+语言程序设计案例教程语言程序设计案例教程7.1 宏定义7.2 文件包含7.3 条件编译3/2/2023预处理不是预处理不是C语言本身的组成部分,不能直语言本身的组成部分,不能直接进行编译。在对源程序编译之前,系统接进行编译。在对源程序编译之前,系统先将这部分命令进行先将这部分命令进行“预处理预处理”,处理后,处理后源程序将不再包括预处理命令,随后系统源程序将不再包括预处理命令,随后系统完成编译,链接生成目标程序。完成编译,链接生成目标程序。C语言提供语言提供3种预处理功能:宏定义;文件种预处理功能:宏定义;文件包含;条件编译。包含;条件编译。3/2/20232案例一案例一 宏的使用宏的使用 1.1.问题描述问题描述计算物体在水中的浮力以及在不同液体和不同物计算物体在水中的浮力以及在不同液体和不同物计算物体在水中的浮力以及在不同液体和不同物计算物体在水中的浮力以及在不同液体和不同物体体积下受到的浮力体体积下受到的浮力体体积下受到的浮力体体积下受到的浮力(假设物体全部沉入水中假设物体全部沉入水中假设物体全部沉入水中假设物体全部沉入水中)。2.2.问题分析问题分析浮力浮力浮力浮力=pgvpgv。在水中,物体受到的浮力与体积有关,在水中,物体受到的浮力与体积有关,在水中,物体受到的浮力与体积有关,在水中,物体受到的浮力与体积有关,g g 是常数,是常数,是常数,是常数,将将将将g g定义为宏定义为宏定义为宏定义为宏(无参宏无参宏无参宏无参宏)。在液体中,不同物体在不同液体中受到的浮力与在液体中,不同物体在不同液体中受到的浮力与在液体中,不同物体在不同液体中受到的浮力与在液体中,不同物体在不同液体中受到的浮力与物体体积和液体的密度有关,将计算公式也定义物体体积和液体的密度有关,将计算公式也定义物体体积和液体的密度有关,将计算公式也定义物体体积和液体的密度有关,将计算公式也定义为宏为宏为宏为宏(有参宏有参宏有参宏有参宏)。3/2/202333.C3.C语言代码语言代码#include#include stdio.hstdio.h /*/*预处理指令是以预处理指令是以预处理指令是以预处理指令是以#号为开头的代码行,号为开头的代码行,号为开头的代码行,号为开头的代码行,#include#include是一个文件包含预处理是一个文件包含预处理是一个文件包含预处理是一个文件包含预处理*/#define g 9.8 /*g#define g 9.8 /*g定义为无参宏定义为无参宏定义为无参宏定义为无参宏*/#define#define F(pF(p,v)(p*9.8*v)/*,v)(p*9.8*v)/*将浮力计算公式定义为有参宏,物体体积将浮力计算公式定义为有参宏,物体体积将浮力计算公式定义为有参宏,物体体积将浮力计算公式定义为有参宏,物体体积v v和液体密度和液体密度和液体密度和液体密度p p为参数,也可将为参数,也可将为参数,也可将为参数,也可将 F(pF(p,v),v)定义为定义为定义为定义为(p*g*v)(p*g*v),即有参宏的嵌套定义,即有参宏的嵌套定义,即有参宏的嵌套定义,即有参宏的嵌套定义*/void main()void main()float F1,F2;float F1,F2;float p,v;float p,v;/*/*以下部分计算物体在水中的浮力以下部分计算物体在水中的浮力以下部分计算物体在水中的浮力以下部分计算物体在水中的浮力F1*/F1*/printfprintf(请输入在水中物体的体积请输入在水中物体的体积请输入在水中物体的体积请输入在水中物体的体积vnvn););scanf(%fscanf(%f,&v);,&v);F1=1000*g*v;/*F1=1000*g*v;/*替换无参宏名替换无参宏名替换无参宏名替换无参宏名g g,将,将,将,将g g替换成数值替换成数值替换成数值替换成数值9.8*/9.8*/printfprintf(物体在水中的浮力是物体在水中的浮力是物体在水中的浮力是物体在水中的浮力是F1=%F1=%fnfn,F1);,F1);/*/*以下部分计算不同物体在不同液体中的浮力以下部分计算不同物体在不同液体中的浮力以下部分计算不同物体在不同液体中的浮力以下部分计算不同物体在不同液体中的浮力F2*/F2*/printfprintf(请输入在某液体中液体的密度请输入在某液体中液体的密度请输入在某液体中液体的密度请输入在某液体中液体的密度p p和物体的体积和物体的体积和物体的体积和物体的体积vnvn););scanf(%fscanf(%f,%f,&p,&v);,%f,&p,&v);F2=F2=F(pF(p,v);,v);/*/*替换有参宏替换有参宏替换有参宏替换有参宏F(pF(p,v),v),将,将,将,将F(pF(p,v),v)替换为表达式替换为表达式替换为表达式替换为表达式p*9.8*v*/p*9.8*v*/*/*如果采用宏的嵌套定义,如果采用宏的嵌套定义,如果采用宏的嵌套定义,如果采用宏的嵌套定义,F(pF(p,v),v)首先替换为表达式首先替换为表达式首先替换为表达式首先替换为表达式p*g*vp*g*v,再替换为,再替换为,再替换为,再替换为p*9.8*v*/p*9.8*v*/printfprintf(物体在液体中的浮力物体在液体中的浮力物体在液体中的浮力物体在液体中的浮力F2=%F2=%fnfn,F2);,F2);#undefundef g;g;/*/*取消取消取消取消g g宏定义宏定义宏定义宏定义*/#undefundef F(pF(p,v);,v);/*/*取消宏取消宏取消宏取消宏F(pF(p,v),v)定义定义定义定义*/3/2/202344.程序运行结果请输入在水中物体的体积请输入在水中物体的体积v12.2物体在水中的浮力是物体在水中的浮力是F1=119560请输入在某液体中液体的密度请输入在某液体中液体的密度p和物体的体和物体的体积积v700,24物体在液体中的浮力物体在液体中的浮力F2=1646403/2/202357.1 宏 定 义宏定义是预处理命令中的一种,它提供了一宏定义是预处理命令中的一种,它提供了一种可以替换源代码中字符串的机制。根据种可以替换源代码中字符串的机制。根据宏中是否有参数,可以将宏定义分为不带宏中是否有参数,可以将宏定义分为不带参数的宏定义和带参数的宏定义。参数的宏定义和带参数的宏定义。3/2/20236宏定义是预处理命令中的一种,它提供了一宏定义是预处理命令中的一种,它提供了一种可以替换源代码中字符串的机制。根据种可以替换源代码中字符串的机制。根据宏中是否有参数,可以将宏定义分为不带宏中是否有参数,可以将宏定义分为不带参数的宏定义和带参数的宏定义。参数的宏定义和带参数的宏定义。3/2/202377.1.1 不带参数的宏定义不带参数的宏定义格式如下:不带参数的宏定义格式如下:#define 标识符标识符 字符串字符串宏定义格式中宏定义格式中“标识符标识符”为用户定义标识符,为用户定义标识符,称为宏名,也叫符号常量,一般用大写字称为宏名,也叫符号常量,一般用大写字母表示。母表示。字符串可以是常量、表达式、格式串等。字符串可以是常量、表达式、格式串等。注意:宏定义不是注意:宏定义不是C语言的语句,宏定义结语言的语句,宏定义结尾没有分号。尾没有分号。3/2/20238说明:说明:说明:说明:(1)(1)预处理中,源程序在宏定义之后出现的所有与宏名一预处理中,源程序在宏定义之后出现的所有与宏名一预处理中,源程序在宏定义之后出现的所有与宏名一预处理中,源程序在宏定义之后出现的所有与宏名一样的标识符都替换成宏定义中的字符串,不做语法检查。样的标识符都替换成宏定义中的字符串,不做语法检查。样的标识符都替换成宏定义中的字符串,不做语法检查。样的标识符都替换成宏定义中的字符串,不做语法检查。例如:将例如:将例如:将例如:将#define g 9.8#define g 9.8错误地写成错误地写成错误地写成错误地写成#define g 98#define g 98,则在编译预处理中将则在编译预处理中将则在编译预处理中将则在编译预处理中将g g替换为替换为替换为替换为9898进行编译。进行编译。进行编译。进行编译。(2)(2)源程序中宏可以嵌套定义。例如,计算圆柱体体积:源程序中宏可以嵌套定义。例如,计算圆柱体体积:源程序中宏可以嵌套定义。例如,计算圆柱体体积:源程序中宏可以嵌套定义。例如,计算圆柱体体积:#define R 6.3#define R 6.3#define HIGHT 12.5#define HIGHT 12.5#define VOLUME (3.14*R*R*HIGHT)/*#define VOLUME (3.14*R*R*HIGHT)/*宏的嵌套定义宏的嵌套定义宏的嵌套定义宏的嵌套定义*/在在在在#define VOLUME (3.14*R*R*HIGHT)#define VOLUME (3.14*R*R*HIGHT)中中中中HIGHTHIGHT和和和和R R宏宏宏宏定义定义定义定义VOLUMEVOLUME在之前,即为宏嵌套定义。在之前,即为宏嵌套定义。在之前,即为宏嵌套定义。在之前,即为宏嵌套定义。3/2/20239嵌套定义的替换过程为由外到内,例如:嵌套定义的替换过程为由外到内,例如:嵌套定义的替换过程为由外到内,例如:嵌套定义的替换过程为由外到内,例如:将宏名将宏名将宏名将宏名R R进行替换,替换结果为进行替换,替换结果为进行替换,替换结果为进行替换,替换结果为#define VOLUME (3.14*6.3*#define VOLUME (3.14*6.3*6.36.3*HIGHT)*HIGHT)将宏名将宏名将宏名将宏名HIGHTHIGHT进行替换,替换结果为进行替换,替换结果为进行替换,替换结果为进行替换,替换结果为#define VILUME (3.14*6.3*#define VILUME (3.14*6.3*6.36.3*12.5)*12.5)案例一中:案例一中:案例一中:案例一中:#define g 9.8#define g 9.8/*g/*g定义为无参宏定义为无参宏定义为无参宏定义为无参宏*/#define#define F(pF(p,v)(p*g*v),v)(p*g*v)/*g/*g宏定义在宏定义在宏定义在宏定义在F F之前,也是宏的嵌套定义之前,也是宏的嵌套定义之前,也是宏的嵌套定义之前,也是宏的嵌套定义*/(3)(3)宏定义的作用域。一个宏名与变量一样也有它的作用域,宏名的作用范围从该宏名的宏定义处宏定义的作用域。一个宏名与变量一样也有它的作用域,宏名的作用范围从该宏名的宏定义处宏定义的作用域。一个宏名与变量一样也有它的作用域,宏名的作用范围从该宏名的宏定义处宏定义的作用域。一个宏名与变量一样也有它的作用域,宏名的作用范围从该宏名的宏定义处开始到所在文件的结尾,或用开始到所在文件的结尾,或用开始到所在文件的结尾,或用开始到所在文件的结尾,或用#undefundef命令取消该宏定义为止。例如,在如下程序段计算物体在水命令取消该宏定义为止。例如,在如下程序段计算物体在水命令取消该宏定义为止。例如,在如下程序段计算物体在水命令取消该宏定义为止。例如,在如下程序段计算物体在水中的浮力,中的浮力,中的浮力,中的浮力,#include#include stdio.hstdio.h#define g 9.8#define g 9.8 /*/*宏名宏名宏名宏名g g定义开始定义开始定义开始定义开始*/void main()void main()float F1;float F1;float p,v;float p,v;.printf(F1=%printf(F1=%fnfn,F1);,F1);undefundef g;g;/*/*undefundef 使得使得使得使得g g的宏定义的作用范围到此处为止的宏定义的作用范围到此处为止的宏定义的作用范围到此处为止的宏定义的作用范围到此处为止*/#define g 9.78#define g 9.78 /*/*宏名宏名宏名宏名g g重新定义新的精度重新定义新的精度重新定义新的精度重新定义新的精度*/3/2/2023107.1.2 带参数的宏定义带参数的宏定义格式如下:带参数的宏定义格式如下:带参数的宏定义格式如下:带参数的宏定义格式如下:#define#define 宏名宏名宏名宏名(参数表参数表参数表参数表)字符串字符串字符串字符串宏名一般为大写,参数表可以有一个或多个参数组成,参数之间用逗宏名一般为大写,参数表可以有一个或多个参数组成,参数之间用逗宏名一般为大写,参数表可以有一个或多个参数组成,参数之间用逗宏名一般为大写,参数表可以有一个或多个参数组成,参数之间用逗号分隔。例如案例一中,号分隔。例如案例一中,号分隔。例如案例一中,号分隔。例如案例一中,#define#define F(pF(p,v)(p*9.8*v),v)(p*9.8*v),p p和和和和v v为参数。为参数。为参数。为参数。带参数宏的调用格式如下:带参数宏的调用格式如下:带参数宏的调用格式如下:带参数宏的调用格式如下:宏名宏名宏名宏名(实参表实参表实参表实参表)即将实参替换形参,其他部分不变。即将实参替换形参,其他部分不变。即将实参替换形参,其他部分不变。即将实参替换形参,其他部分不变。例如,假设有例如,假设有例如,假设有例如,假设有#define#define SW(xSW(x)(x)*(x)(x)*(x)如果程序中有语句如果程序中有语句如果程序中有语句如果程序中有语句x=SW(5);x=SW(5);,那么编译系统会将,那么编译系统会将,那么编译系统会将,那么编译系统会将SW(5)SW(5)替换为替换为替换为替换为5*55*5。但。但。但。但输出语句双引号中的宏定义不做替换。例如:输出语句双引号中的宏定义不做替换。例如:输出语句双引号中的宏定义不做替换。例如:输出语句双引号中的宏定义不做替换。例如:#define XYZ this is a test#define XYZ this is a test printf(XYZprintf(XYZ););输出输出输出输出XYZXYZ,而不是,而不是,而不是,而不是this is a testthis is a test。3/2/202311说明:说明:说明:说明:(1)(1)定义时参数和字符串部分要分别用括号括起来,宏名与参数表的定义时参数和字符串部分要分别用括号括起来,宏名与参数表的定义时参数和字符串部分要分别用括号括起来,宏名与参数表的定义时参数和字符串部分要分别用括号括起来,宏名与参数表的括号之间不要加空格,否则就成为不带参数的宏定义语句了。括号之间不要加空格,否则就成为不带参数的宏定义语句了。括号之间不要加空格,否则就成为不带参数的宏定义语句了。括号之间不要加空格,否则就成为不带参数的宏定义语句了。(2)(2)为了保证在宏展开后,字符串中各个参数的计算顺序正确,应当为了保证在宏展开后,字符串中各个参数的计算顺序正确,应当为了保证在宏展开后,字符串中各个参数的计算顺序正确,应当为了保证在宏展开后,字符串中各个参数的计算顺序正确,应当在宏定义中的字符串最外面以及其中的各个参数外面加上圆括号。在宏定义中的字符串最外面以及其中的各个参数外面加上圆括号。在宏定义中的字符串最外面以及其中的各个参数外面加上圆括号。在宏定义中的字符串最外面以及其中的各个参数外面加上圆括号。例如,比较以下两个例子。例如,比较以下两个例子。例如,比较以下两个例子。例如,比较以下两个例子。#define#define sqr(xsqr(x)(x*x)(x*x)#define sqr(x)(x)*(x)#define sqr(x)(x)*(x)如果在后续程序中有如果在后续程序中有如果在后续程序中有如果在后续程序中有s=s=sqr(a+bsqr(a+b),程序在预处理时会产生不同的结果:,程序在预处理时会产生不同的结果:,程序在预处理时会产生不同的结果:,程序在预处理时会产生不同的结果:sqr(xsqr(x)替换为替换为替换为替换为(a+ba+b*a+ba+b);sqr(xsqr(x)替换为替换为替换为替换为(a+ba+b)*()*(a+ba+b)。(3)(3)在带参宏定义时,也有宏嵌套定义。在带参宏定义时,也有宏嵌套定义。在带参宏定义时,也有宏嵌套定义。在带参宏定义时,也有宏嵌套定义。(4)(4)带参数的宏和函数存在相似之处。例如它们的表示形式都是由一带参数的宏和函数存在相似之处。例如它们的表示形式都是由一带参数的宏和函数存在相似之处。例如它们的表示形式都是由一带参数的宏和函数存在相似之处。例如它们的表示形式都是由一个名字加上几个参数,引用方式也相同,实参和形参的个数都要求个名字加上几个参数,引用方式也相同,实参和形参的个数都要求个名字加上几个参数,引用方式也相同,实参和形参的个数都要求个名字加上几个参数,引用方式也相同,实参和形参的个数都要求相同,但是要注意它们之间的区别。比较以下有参宏和函数的定义:相同,但是要注意它们之间的区别。比较以下有参宏和函数的定义:相同,但是要注意它们之间的区别。比较以下有参宏和函数的定义:相同,但是要注意它们之间的区别。比较以下有参宏和函数的定义:3/2/202312例例例例7.1 7.1 将一表达式分别定义为宏和函数。将一表达式分别定义为宏和函数。将一表达式分别定义为宏和函数。将一表达式分别定义为宏和函数。#include#include#define#define SQR(xSQR(x)(x)*(x)/*)(x)*(x)/*宏定义以宏定义以宏定义以宏定义以#define#define开头,不需要对形参进行数据类型声明,不需对开头,不需要对形参进行数据类型声明,不需对开头,不需要对形参进行数据类型声明,不需对开头,不需要对形参进行数据类型声明,不需对宏进行宏类型声明,在宏展开时只是完成替换。宏进行宏类型声明,在宏展开时只是完成替换。宏进行宏类型声明,在宏展开时只是完成替换。宏进行宏类型声明,在宏展开时只是完成替换。*/intint SR(intSR(int x)/*x)/*函数定义没有函数定义没有函数定义没有函数定义没有#define#define,有参函数需要对形参进行数据类型声明,函数调用时需要,有参函数需要对形参进行数据类型声明,函数调用时需要,有参函数需要对形参进行数据类型声明,函数调用时需要,有参函数需要对形参进行数据类型声明,函数调用时需要参数传递,要声明函数的类型参数传递,要声明函数的类型参数传递,要声明函数的类型参数传递,要声明函数的类型(intint类型除外类型除外类型除外类型除外)。*/return(x)*(x);return(x)*(x);void main()void main()intint i;i;i=1;i=1;printfprintf(宏替换如下:宏替换如下:宏替换如下:宏替换如下:n);n);do do printf(%dnprintf(%dn,SQR(iSQR(i+);/*+);/*宏替换宏替换宏替换宏替换*/while(iwhile(i=5);=5);i=1;i=1;printfprintf(函数运行如下:函数运行如下:函数运行如下:函数运行如下:n);n);do do printf(%dnprintf(%dn,SR(iSR(i+);/*+);/*函数调用函数调用函数调用函数调用*/while(iwhile(i=5);b)?#define MAX1(a,b)(ab)?a:ba:b)/*a)/*a、b b的数据类型可以是整型、浮点型的数据类型可以是整型、浮点型的数据类型可以是整型、浮点型的数据类型可以是整型、浮点型*/有如下函数定义:有如下函数定义:有如下函数定义:有如下函数定义:MAX2(MAX2(intint a,a,intint b)b)return(ab)?return(ab)?a:ba:b);/*a);/*a、b b如果是浮点型,需修改形参的数据类型定如果是浮点型,需修改形参的数据类型定如果是浮点型,需修改形参的数据类型定如果是浮点型,需修改形参的数据类型定义义义义*/3/2/202315案例二案例二 文件包含的使用文件包含的使用 1.问题描述根据物体的体积和液体密度,计算物体的浮根据物体的体积和液体密度,计算物体的浮力力(假设物体全部沉入水中假设物体全部沉入水中)。2.问题分析使用文件包含预处理,将使用文件包含预处理,将#define g 9.8和和#define F(p,v)(p*g*v)保存在保存在user.h文文件,源程序中不再出现宏定义。件,源程序中不再出现宏定义。3/2/2023163.C3.C语言代码语言代码#include#include#include#include user.huser.h /*/*使用使用使用使用#include#include 将宏定义所在文件加载到将宏定义所在文件加载到将宏定义所在文件加载到将宏定义所在文件加载到C C源程源程源程源程序中序中序中序中*/main()main()float p,v,F2;float p,v,F2;printfprintf(请输入在某液体中液体的密度请输入在某液体中液体的密度请输入在某液体中液体的密度请输入在某液体中液体的密度p p和物体的体积和物体的体积和物体的体积和物体的体积vnvn););scanf(%fscanf(%f,%f,&p,&v);,%f,&p,&v);F2=F2=F(pF(p,v);,v);printfprintf(物体在液体中的最大浮力物体在液体中的最大浮力物体在液体中的最大浮力物体在液体中的最大浮力F2=%F2=%fnfn,F2);,F2);4.4.程序运行结果程序运行结果请输入在某液体中液体的密度请输入在某液体中液体的密度请输入在某液体中液体的密度请输入在某液体中液体的密度p p和物体的体积和物体的体积和物体的体积和物体的体积v v700,15700,15物体在液体中的最大浮力物体在液体中的最大浮力物体在液体中的最大浮力物体在液体中的最大浮力F2=102900F2=1029003/2/2023177.2 文 件 包 含文件包含的使用是编写文件包含的使用是编写C语言程序中不可缺语言程序中不可缺少的,我们在引用少的,我们在引用C语言库函数时要使用语言库函数时要使用它;另外,我们也可以将平时积累的一些它;另外,我们也可以将平时积累的一些有用的自定义函数做成一个自定义函数库有用的自定义函数做成一个自定义函数库文件,要使用它们时只需采用文件包含将文件,要使用它们时只需采用文件包含将它们引用过来使用就行,这样就减少了编它们引用过来使用就行,这样就减少了编程的工作量,提高编译效率。程的工作量,提高编译效率。文件包含定义格式如下:文件包含定义格式如下:#include 或或#include 文件名文件名3/2/202318例如:例如:例如:例如:#include#include 或或或或#include#include stdio.hstdio.h。一个文件包含预处理只能包含一个被包含文件。例如,使一个文件包含预处理只能包含一个被包含文件。例如,使一个文件包含预处理只能包含一个被包含文件。例如,使一个文件包含预处理只能包含一个被包含文件。例如,使用文件包含计算一个实数的绝对值和的用文件包含计算一个实数的绝对值和的用文件包含计算一个实数的绝对值和的用文件包含计算一个实数的绝对值和的sin()sin()值,并输出。值,并输出。值,并输出。值,并输出。输入输出函数在输入输出函数在输入输出函数在输入输出函数在stdio.hstdio.h文件中,绝对值和文件中,绝对值和文件中,绝对值和文件中,绝对值和sin()sin()在在在在math.hmath.h文文文文件中,所以除了要在文件包含预处理中有件中,所以除了要在文件包含预处理中有件中,所以除了要在文件包含预处理中有件中,所以除了要在文件包含预处理中有stdio.hstdio.h,还需,还需,还需,还需要有要有要有要有math.hmath.h。#include#include/*/*包含标准输入输出的头文件包含标准输入输出的头文件包含标准输入输出的头文件包含标准输入输出的头文件stdio.hstdio.h*/*/#include#include /*/*包含数学函数的头文件包含数学函数的头文件包含数学函数的头文件包含数学函数的头文件math.hmath.h*/*/main()main().3/2/202319除包含系统文件外,也可将用户定义的宏保存在用户文件除包含系统文件外,也可将用户定义的宏保存在用户文件除包含系统文件外,也可将用户定义的宏保存在用户文件除包含系统文件外,也可将用户定义的宏保存在用户文件中,在源程序需要宏的时候,将用户文件包含在源文件中,在源程序需要宏的时候,将用户文件包含在源文件中,在源程序需要宏的时候,将用户文件包含在源文件中,在源程序需要宏的时候,将用户文件包含在源文件中。如案例二中,将宏定义中。如案例二中,将宏定义中。如案例二中,将宏定义中。如案例二中,将宏定义g g和和和和F F定义于定义于定义于定义于user.huser.h文件中。文件中。文件中。文件中。使用文件包含,需注意以下几点:使用文件包含,需注意以下几点:使用文件包含,需注意以下几点:使用文件包含,需注意以下几点:(1)(1)若使用符号若使用符号若使用符号若使用符号,系统到存放,系统到存放,系统到存放,系统到存放C C库函数头文件所在目录库函数头文件所在目录库函数头文件所在目录库函数头文件所在目录寻找要包含的文件,一般使用库函数使用此符号;若使寻找要包含的文件,一般使用库函数使用此符号;若使寻找要包含的文件,一般使用库函数使用此符号;若使寻找要包含的文件,一般使用库函数使用此符号;若使用符号用符号用符号用符号,系统在用户程序所在的当前目录寻找要包含,系统在用户程序所在的当前目录寻找要包含,系统在用户程序所在的当前目录寻找要包含,系统在用户程序所在的当前目录寻找要包含的文件,如果找不到再到的文件,如果找不到再到的文件,如果找不到再到的文件,如果找不到再到C C库函数头文件所在目录寻找,库函数头文件所在目录寻找,库函数头文件所在目录寻找,库函数头文件所在目录寻找,一般使用用户函数使用此符号。一般使用用户函数使用此符号。一般使用用户函数使用此符号。一般使用用户函数使用此符号。(2)(2)在预处理时,文件包含命令用被包含文件内容替换,在预处理时,文件包含命令用被包含文件内容替换,在预处理时,文件包含命令用被包含文件内容替换,在预处理时,文件包含命令用被包含文件内容替换,成为源文件内容的一部分,与其他源文件代码一起参加成为源文件内容的一部分,与其他源文件代码一起参加成为源文件内容的一部分,与其他源文件代码一起参加成为源文件内容的一部分,与其他源文件代码一起参加编译。例如案例二中使用编译。例如案例二中使用编译。例如案例二中使用编译。例如案例二中使用#include#include将将将将stdio.hstdio.h的所有内容,的所有内容,的所有内容,的所有内容,与与与与user.huser.h包含宏定义的文件内容嵌入到该预处理命令处包含宏定义的文件内容嵌入到该预处理命令处包含宏定义的文件内容嵌入到该预处理命令处包含宏定义的文件内容嵌入到该预处理命令处成为源文件的一部分。成为源文件的一部分。成为源文件的一部分。成为源文件的一部分。(3)(3)可以将多个需要包含的内容写到一个头文件中,如案可以将多个需要包含的内容写到一个头文件中,如案可以将多个需要包含的内容写到一个头文件中,如案可以将多个需要包含的内容写到一个头文件中,如案例二;也可以将文件进行嵌套包含。例二;也可以将文件进行嵌套包含。例二;也可以将文件进行嵌套包含。例二;也可以将文件进行嵌套包含。3/2/202320例例例例7.2 7.2 文件嵌套包含的使用。文件嵌套包含的使用。文件嵌套包含的使用。文件嵌套包含的使用。将将将将#define#define F(pF(p,v)(p*g*v),v)(p*g*v)宏定义保存在宏定义保存在宏定义保存在宏定义保存在user1.huser1.h中,中,中,中,#define g 9.8#define g 9.8宏定义保宏定义保宏定义保宏定义保存在存在存在存在user2.huser2.h中。中。中。中。user1.huser1.h文件内容:文件内容:文件内容:文件内容:#include user2.h#include user2.h#define#define F(pF(p,v)(p*g*v),v)(p*g*v)user2.huser2.h文件内容:文件内容:文件内容:文件内容:#define g 9.8 /*#define g 9.8 /*注意:这里没有文件包含预处理注意:这里没有文件包含预处理注意:这里没有文件包含预处理注意:这里没有文件包含预处理*/使用文件嵌套预处理之后,案例二中的文件预处理程序段如下所示:使用文件嵌套预处理之后,案例二中的文件预处理程序段如下所示:使用文件嵌套预处理之后,案例二中的文件预处理程序段如下所示:使用文件嵌套预处理之后,案例二中的文件预处理程序段如下所示:#include#include stdio.hstdio.h#include user1.h /*#include user1.h /*使用文件包含,将宏定义的使用文件包含,将宏定义的使用文件包含,将宏定义的使用文件包含,将宏定义的g g和和和和F F进行预处理进行预处理进行预处理进行预处理*/main()main()float p,v,F2;float p,v,F2;printfprintf(请输入在某液体中液体的密度请输入在某液体中液体的密度请输入在某液体中液体的密度请输入在某液体中液体的密度p p和物体的体积和物体的体积和物体的体积和物体的体积vnvn););scanf(%fscanf(%f,%f,&p,&v);,%f,&p,&v);F2=F2=F(pF(p,v);,v);printfprintf(the F2 is%(the F2 is%fnfn,F2);,F2);3/2/202321程序运行结果如下:程序运行结果如下:请输入在某液体中液体的密度请输入在某液体中液体的密度p和物体的体和物体的体积积v700,24the F2=164640这与案例二中计算在某液体中物体受到的浮这与案例二中计算在某液体中物体受到的浮力结果相同。力结果相同。3/2/202322案例三案例三#ifdef命令和命令和#ifndef命令命令的使用的使用 1.问题描述编写程序,使程序编译后的程序既能够在编写程序,使程序编译后的程序既能够在16位机上运行的目标代码,也能在位机上运行的目标代码,也能在32位机上位机上运行的目标代码。运行的目标代码。2.问题分析16位机与位机与32位机在数据类型上主要是整数存位机在数据类型上主要是整数存储长度不一样,采用条件编译解决数据位储长度不一样,采用条件编译解决数据位数的问题。数的问题。3/2/2023233.C3.C语言代码语言代码#include#include main()main()#ifdefifdef PC16 /*PC16 /*若若若若PC16PC16被定义为宏,则完成以下预被定义为宏,则完成以下预被定义为宏,则完成以下预被定义为宏,则完成以下预处理处理处理处理*/#define INTSIZE16 /*16#define INTSIZE16 /*16位整型被定义为宏位整型被定义为宏位整型被定义为宏位整型被定义为宏INTSIZE*/INTSIZE*/#else /*#else /*若若若若PC16PC16未被定义为宏,则完成以下预未被定义为宏,则完成以下预未被定义为宏,则完成以下预未被定义为宏,则完成以下预处理处理处理处理*/#define INTSIZE32 /*32#define INTSIZE32 /*32位整型数被定义为宏位整型数被定义为宏位整型数被定义为宏位整型数被定义为宏INTSIZE*/INTSIZE*/#endifendif /*#/*#ifdefifdef结束结束结束结束*/3/2/2023247.3 条 件 编 译为了测试程序运行情况,可以通过在程序中添加为了测试程序运行情况,可以通过在程序中添加为了测试程序运行情况,可以通过在程序中添加为了测试程序运行情况,可以通过在程序中添加一些输出语句,根据输出的结果判定程序运行结一些输出语句,根据输出的结果判定程序运行结一些输出语句,根据输出的结果判定程序运行结一些输出语句,根据输出的结果判定程序运行结果是否正确,对错误的程序进行修改直到满足需果是否正确,对错误的程序进行修改直到满足需果是否正确,对错误的程序进行修改直到满足需果是否正确,对错误的程序进行修改直到满足需要。调试结束后将这些输出语句再进行删除。要。调试结束后将这些输出语句再进行删除。要。调试结束后将这些输出语句再进行删除。要。调试结束后将这些输出语句再进行删除。C C语言提供了条件编译预处理,能更好的解决测试语言提供了条件编译预处理,能更好的解决测试语言提供了条件编译预处理,能更好的解决测试语言提供了条件编译预处理,能更好的解决测试问题。问题。问题。问题。对程序中的所有源代码有时只需要对其中部分代对程序中的所有源代码有时只需要对其中部分代对程序中的所有源代码有时只需要对其中部分代对程序中的所有源代码有时只需要对其中部分代码进行编译,也就是对部分代码有选择地进行编码进行编译,也就是对部分代码有选择地进行编码进行编译,也就是对部分代码有选择地进行编码进行编译,也就是对部分代码有选择地进行编译,该过程称为条件编译。条件编译主要有译,该过程称为条件编译。条件编译主要有译,该过程称为条件编译。条件编译主要有译,该过程称为条件编译。条件编译主要有#ifdefifdef命令命令命令命令 、#ifndefifndef 命令还有命令还有命令还有命令还有#if#if命令。命令。命令。命令。条件编译主要有以下几种形式,条件编译主要有以下几种形式,条件编译主要有以下几种形式,条件编译主要有以下几种形式,#ifdefifdef和和和和#ifndeifnde,以及,以及,以及,以及#if#if,分别如表,分别如表,分别如表,分别如表7-17-17-37-3所示所示所示所示 3/2/202325表7-1#ifdef条件编译形式条件编译形式说 明#ifdef宏名 语句#endif如果宏名被定义过,则执行语句#ifdef宏名 语句1#else 语句2#endif宏名如果宏名被定义过,则执行语句1,否则执行语句23/2/202326表7-2#ifndef条件编译形式条件编译形式说 明#ifndef 宏名 语句#endif如果宏名未被定义过,则执行语句#ifndef 宏名 语句1#else 语句2#endif如果宏名未被定义过,则执行语句1,否则执行语句23/2/202327表7-3#if条件编译形式条件编译形式说 明#if 表达式1 程序段1#endif如果表达式1为真,则执行程序段1#if表达式1程序段1#else 程序段2#endif如果表达式1为真,则执行程序段1,否则执行程序段2#if表达式1程序段1#elif 表达式2程序段2#endif如果表达式1为真,则执行程序段1,否则表达式2为真,执行程序段23/2/202328(1)#if(1)#if命令中表达式必须是常数表达式,不能包命令中表达式必须是常数表达式,不能包命令中表达式必须是常数表达式,不能包命令中表达式必须是常数表达式,不能包含变量,因为条件编译在编译预处理时进行,而含变量,因为条件编译在编译预处理时进行,而含变量,因为条件编译在编译预处理时进行,而含变量,因为条件编译在编译预处理时进行,而在预处理时不可能知道变量的值。在预处理时不可能知道变量的值。在预处

    注意事项

    本文(第7章编译预处理.ppt)为本站会员(可****阿)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

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

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开