




已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第9章编译预处理,*1、宏定义*2、文件包含3、条件编译,预处理命令,编译预处理:在编译源程序之前根据预处理命令对源程序进行的预加工,由编译系统中的预处理程序完成。格式:以符号“#”开头如:#include位置:宏定义与文件包含命令一般放在程序的开头(原则上可以放在程序中的任意位置)作用域:从定义起直到其所在源程序的末尾。使用预处理命令的好处:(分别介绍)改进程序设计环境,提高编程效率,易读、易改,9.1宏定义,一、不带参数的宏定义:常用于将一些有特殊含义的常量定义成符号常量,使程序易读、易改。例如3.14代表,2.71代表e,用-1表示文件的结束标志等。如果在程序中直接用3.14,2.71,-1等这些值,会出现以下问题:1)数值的含义不明显,影响程序的可读性。2)若程序中多次使用某一个常量,要修改时必须一一修改,即麻烦又易出错。用不带参数的宏定义,可以很好的解决此问题。,不带参数的宏定义,如符号常量的定义:#definePI3.14#defineE2.71#defineEOF-1#defineNULL0#defineNUM_STU30若程序中有语句:for(j=o;jy)?(x):(y);*/printf(“n%d”,MAX(t,z);/*预处理后:printf(“n%d”,(tz)?(t):(z);*/,带参宏定义的一般形式:#define宏名(参数表)宏体预处理时进行如下宏替换:用宏体替换宏名的同时,用实参分别替换形参,而不是用实参的值,即替换时不进行任何计算。本例中的语句:t=MAX(x,y);若理解为:t=(1020)?(10):(20);则错。,特别提示:使用带参宏定义时,宏体、宏体中的参数要用括号扩起来,以保证替换后不影响原来的运算顺序。例:#defineSQ(a)a*a若有语句:y=SQ(m+n);则于处理后变成:y=m+n*m+n;明显与原题意不符。应定义为:#defineSQ(a)(a)*(a)三、取消宏定义:当程序中已不再需要某个宏定义,或需改变某个宏定义时,可以用取消宏定义命令取消前面定义的宏。如:#defineLEN100#undefLEN,9.2文件包含,文件包含是实现结构化程序设计的重要手段之一定义:文件包含是指用#include命令将另一指定的源文件包含进当前源程序文件中#include命令所处的位置,共同组成一个程序文件,然后对合并后的源文件进行编译、连接,生成一个目标文件。文件包含命令的一般形式有两种:格式1:#include格式2:#include文件名如:#include#includemath.h#includec:tcfa.c其中,文件名中可以包含文件的路径。,图9.1给出了文件包含命令的预处理过程。,例9.4对任意整数开平方的主程序文件f_m.c:#include“math.h”main()doublea=10;printf(“n%f”,sqrt(a);预处理后,头文件math.h中的内容即插入到当前文件的#include命令处,实现源文件的组合。,文件包含的应用,用法1):结构化程序设计中,用include命令包含标准库函数的头文件例:#include#include“string.h”等用法2):结构化程序设计中,用include命令包含用户自己编写的文件,即将多个源程序文件组合成一个源程序。例9.5:下面程序实现将两个源程序组合为一个源程序。其中主程序文件为file_m.c,被调函数分别在A盘的file1.c文件中和c盘的my文件夹中的file2.c文件中。,例9.5主程序文件file_m.c:#include“a:file1.c”#include“c:myfile2.c”main()intx;floaty;scanf(“%d”,文件file1.c:floatf1(inta)floatz;z=a*a+1;return(z);文件file2.c:floatf2(intb)floatm;m=2.5*b-1;return(m);,例9.6将程序设计中常用的一些符号常量定义、带参宏定义、数据结构定义、通用函数的定义等分别编写成一个个单独的文件,存盘待用。以后编程时用include命令将其包含进来即可。避免重复劳动。如count.h文件中包含嵌一节中的符号常量的定义:#definePI3.14#defineE2.71#defineNULL0#defineEOF-1编程时若需要其中的符号常量,则只要在文件的开头写上以下命令即可:#include“count.h”,9.3条件编译,条件编译:就是根据不同的编译条件选择源程序的某些程序段进行编译,从而使同一个源程序在不同的编译条件下可以产生适应不同要求的目标代码程序。条件编译命令条件编译的应用:1)便于程序调试(*)2)便于程序移植,拓展c的编程环境3)便于编写通用软件,主要条件编译命令,1、#if命令的一般形式:#if常量表达式程序段1#else程序段2#endif功能:预处理时,先计算常量表达式的值,若该值为真,则编译程序段,否则编译程序段2。注意问题:因为该命令是在预处理时执行的,所以#if后的表达式必须是常量。,2、#ifdef命令的一般形式:#ifdef宏名程序段1#else程序段2#endif功能:该命令的预处理过程是,如果宏明在此之前已经定义过,则编译程序段1;否则,编译程序段2。3、与#ifdef类似的命令:#ifndef宏名程序段1#else程序段2#endif功能:若宏名未定义,则编译程序段;否则编译程序段2。,条件编译的应用,1)用于调试程序:在程序调试时经常需要再程序中插入一些输出语句、暂停程序执行的语句等(这些语句并非程序功能所要求的,一般称为调试语句),以便了解程序的大致执行过程,并根据运行的中间结果查找错误的位置,分析其原因。但当程序调试结束后,这些调试语句就不再需要了,怎么办呢?一般的方法是逐一将其删去。这样做不但麻烦,而且容易出错:因为当程序较长时,很难分清调试语句与正常的输出语句(其格式相同,只是所起的作用不同);而且调试语句一定要删除干净,否则也会出现意外。使用条件编译则可以省去删除调试语句的工作,既方便又准确。,例9.7在调试较大程序时,使用条件编译命令适当加入一些输出语句,测试中间结果,便于寻找程序中的错误及其所在位置。程序:l9_3_2.c(见下页)调试时,由于DEBUG已经被定义,因此调试语句(输出数组各元素)被编译,运行结果如下()该调试语句的作用是检查数据的输入操作是否有错。若输入数据正确,而运行结果不正确,则可进一步确定是后面的数据处理出错了。调试无误后,该调试语句不再需要,只要将宏定义命令该为#defineDEBUG0即可。,#defineDEBUG1main()inta34,i,j;floatsum,aver;printf(ninput4scoresofeachstudent:n);for(i=0;i3;i+)printf(nstudent%d:,i);for(j=0;j4;j+)scanf(%d,#ifdefDEBUGfor(i=0;i3;i+)printf(n);for(j=0;j4;j+)printf(%6d,aij);#endiffor(i=0;i3;i+)sum=0;for(j=0;j4;j+)sum+=aij;printf(n%daver:%f,i,sum/4);,2、条件编译用于程序移植不同类型的机器给整型(或其他类型)数据分配的空间并不完全相同。为了提高程序的可以移植性,可以与机器有关的语句从一般语句中隔离出来,放入条件编译命令中。如:关于整型数据的长度的宏定义放在条件编译结构中:#definePDP_111#ifdefPDP_11#defineINT_SIZE16#else#defineINT_SIZE32#endif预处理时,若PDP_11被定义,则#defineINT_SIZE16将被编译,否则命令#defineINT_SIZE32将被编译。变换机型时,只要改变确定机型的宏定义即可。,编译预处理小结,本章主要介绍了常用的三种预处理命令:宏定义、文件包含、条件编译。其中,不带参的宏定义常用来定义符号常量,带参宏定义常用来定义一些简单操作;文件包含主要用于两个方面:包含程序中要调用的库函数的头文件,包含用户编写的文件(程序文件、有关符号常量定义的文件、包有关被调函数声明的文件等);条件编译通常用于程序调试和提高程序的可移植性,方法是将调试语句和与机型有关的语句放在条件编译结构中。,练习,1、写出下面程序的运行结果:#i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 快速提高珠心算能力的教学实施方案
- 基于深度学习的工业安全行为检测技术的研究与实现
- 七年级语文上册 第一单元 2济南的冬天说课稿 新人教版
- CMMI三级认证项目访谈问题集
- 第三课 搜索网络信息说课稿-2025-2026学年初中信息技术教科版七年级上册-教科版
- 银行电子渠道风险管理方案
- 三年级学生诗歌朗诵素材及点评
- 健康饮食:榨汁机营养搭配指南
- 7.陶艺创作(教学设计)- - 人美版初中美术九年级上册
- 泌尿系疾病诊断与治疗指南更新版
- 2026年日历表全年表(含农历、周数、节假日及调休-A4纸可直接打印)-
- 兴安盟兴泉矿业有限责任公司饮用天然矿泉水厂2024年度环境治理计划
- 《销售团队目标管理》课件
- 肌动蛋白结合蛋白筛选技术-深度研究
- 二手房交房确认书2025年
- 中华民族共同体概论讲稿专家版《中华民族共同体概论》大讲堂之第一讲:中华民族共同体基础理论
- 形势与政策补考2-国开(XJ)-参考资料
- GB/T 15597.2-2024塑料聚甲基丙烯酸甲酯(PMMA)模塑和挤出材料第2部分:试样制备和性能测定
- JT-T-1180.1-2018交通运输企业安全生产标准化建设基本规范第1部分:总体要求
- 数字货币概论 课件 第5章 稳定币的原理与实现
- 现代礼仪与沟通(大学生礼仪沟通课程)全套教学课件
评论
0/150
提交评论