C语言程序设计第10章-程序编译预处理.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《C语言程序设计第10章-程序编译预处理.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 10 程序 编译 预处理
- 资源描述:
-
1、 程序设计技术基础(C语言)2022-8-82第10章程序预编译处理2022-8-83 C语言是基于函数模式的编程语言,编译器在进行编译的时候,调用不同的函数完成整体的任务。当它需要调用某个函数的时候,需要知道这个函数的函数原型(通常也叫函数声明)。编译系统在获得的函数的基本信息中,要求有函数的入口地址、相关的参数等。如果函数同时参与了其它的运算工作,例如赋值给一个指定的变量,编译系统还需要掌握该函数的返回数据类型。这些相关的信息可以分别放在不同的头文件(H文件)中,系统在编译的过程中自动调用就可以。2022-8-84说明什么是宏定义及其运用说明文件包含的基本概念与具体运用方法说明条件编译的基
2、本概念与具体运用方法通过案例说明如何使用预编译资源本章内容2022-8-85C语言编译原理2022-8-86 使用编辑器编写完成源代码,就可以调用C语言的编译器将源文件转换成机器码。编译器在处理中,一个单元只包含一个源代码文件(.c程序)。如果没有错误生成对应的目标文件(.obj文件)。最终通过连接器将全部的目标文件进行组合后生成对应的可执行文件(.exe文件)交给操作系统执行。在设计过程中可能会遇到一些代码需要重复执行,或某些参数、公式等频繁使用,为了便于程序设计,可以通过预定义方式设置成一些可以替换的代码。2022-8-872022-8-88sin(x)=?2022-8-89文件包含命令#
3、include2022-8-810#include/主函数int main()/定义主函数/主函数体开始int max(int x,int y);/对被调用函数max的声明int a,b,c;/定义变量a,b,cscanf(%d,%d,&a,&b);/输入变量a和b的值c=max(a,b);/调用max函数,将得到的值赋给cprintf(max=%dn,c);/输出c的值return 0;/返回函数值为0/主函数体结束#include#include“stdio.h”2022-8-811文件包含命令注意事项(1)包含命令中的文件名可以用双引号括起来,也可以用尖括号括起来。例如以下写法都是允许的
4、:#include stdio.h#include但是这两种形式是有区别的:u使用尖括号表示在包含文件目录中去查找(包含目录是由用户在设置环境时设置的),而不在源文件目录去查找;u使用双引号则表示首先在当前的源文件目录中查找,若未找到才到包含目录中去查找。用户编程时可根据自己文件所在的目录来选择某一种命令形式。(2)一个include命令只能指定一个被包含文件,若有多个文件要包含,则需用多个include命令。(3)文件包含允许嵌套,即在一个被包含的文件中又可以包含另一个文件。2022-8-81210.2.1 调用方式1.基本调用方式#include#include 头文件名u使用“”将指定的
5、头文件(.h)文件加载到程序中,它指定的文件是在系统的安装目录中。当要引用的头文件是标准的链接库头文件时应当采用此方法。u使用“”与“”将指定的头文件则用于自己定义的通用函数,在编写C代码的时候就需要注意定义方式与引用的方式。2022-8-81310.2.1 调用方式2.创建一个自己的头文件 在进行程序设计的过程中,我们可以自己创建一个专门的头文件(.h)来保存相应的函数声明,在其它的源文件(.c)中定义函数并调用函数。在函数章节中曾经介绍,在C语言中只能有一个main()函数,但为了实现代码的重用功能,可以将重复出现的函数单独保存成源文件,在调用的时候,多个文件共同进行编译。而使用头文件则可
6、以直接使用这些定义的函数内容。2022-8-814#include/从系统安装的位置查找h文件#include func.h/从当前位置查找相应的h文件int main()int a=1,b=2;printf(a,b中%d是小的数字n,min(a,b);printf(a,b中%d是大的数字n,max(a,b);/func.h/自定义获得两个整数中的最小值int min(int a,int b)return ab?b:a;/自定义获得两个整数中的最大值int max(int a,int b)return ab?a:b;2022-8-8152022-8-816如果将系统提供的math.h加入mai
7、n()函数会如何?导入的头文件中如果出现同名的函数会如何?思考题2022-8-81710.2.2 C语言中典型的库文件 系统提供了丰富的系统文件,称为库文件,C 的库文件分为两类,一类是扩展名为“.h”的文件,称为头文件,在前面的包含命令中我们已多次使用过。在“.h”文件中包含了常量定义、类型定义、宏定义、函数原型以及各种编译选择设置等信息。另一类是函数库,包括了各种函数的目标代码,供用户在程序中调用。通常在程序中调用一个库函数时,要在调用之前包含该函数原型所在的“.h”文件。2022-8-81810.2.2 C语言中典型的库文件典型的头文件uALLOC.H 说明内存管理函数(分配、释放等)。
8、uASSERT.H 定义 assert 调试宏。uBIOS.H 说明调用IBMPC ROM BIOS子程序的各个函数。uCONIO.H 说明调用DOS 控制台I/O子程序的各个函数。uCTYPE.H 包含有关字符分类及转换的名类信息(如isalpha和toascii等)。uDIR.H 包含有关目录和路径的结构、宏定义和函数。uDOS.H 定义和说明MSDOS和8086调用的一些常量和函数。uERRON.H 定义错误代码的助记符。uFCNTL.H 定义在与open库子程序连接时的符号常量。uFLOAT.H 包含有关浮点运算的一些参数和函数。2022-8-81910.2.2 C语言中典型的库文件典
9、型的头文件uGRAPHICS.H 说明有关图形功能的各个函数,图形错误代码的常量定义,对应不同驱动程序的各种颜色值及函数用到的一些特殊结构。需要注意的是此项功能只能运用在DOS编程中。uIO.H 包含低级I/O子程序的结构和说明。uLIMIT.H 包含各环境参数、编译时间限制、数的范围等信息。uMATH.H 说明数学运算函数,还定了HUGE VAL宏,说明了matherr和matherr子程序用到的特殊结构。uMEM.H 说明一些内存操作函数(其中大多数也在STRING.H中说明)。uPROCESS.H 说明进程管理的各个函数,spawn和EXEC函数的结构说明。uSETJMP.H定义long
10、jmp和setjmp函数用到的jmp buf 类型,并说明这两个函数。2022-8-820典型的头文件10.2.2 C语言中典型的库文件uSHARE.H 定义文件共享函数的参数。uSIGNAL.H 定义SIGZZ(Z ZZ)IGN 和SIGZZ(Z ZZ)DFL常量,说明rajse和signal两个函数。uSTDARG.H 定义读函数参数表的宏。(如vprintf,vscarf函数)。uSTDDEF.H 定义一些公共数据类型和宏。uSTDIO.H 定义Kernighan 和Ritchie 在Unix System V中定义的标准和扩展的类型和宏。还定义标准I/O预定义流:stdin、stdou
11、t和stderr,说明I/O流子程序。uSTDLIB.H 说明一些常用的子程序:转换子程序、搜索与排序子程序等。uSTRING.H 说明一些串操作和内存操作函数。2022-8-821宏定义#define2022-8-822在介绍C语言的基础定义时,我们知道常量的功能是为了便于程序的开发,对于程序中重复使用的数据或系统使用的语句可以定义为常量。宏定义在一定意义上有些像常量的效果。在基础的编程中,使用常量便于程序编写,而在高级编程中,使用宏定义方式表示更多的思想。例如在语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“
12、宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。2022-8-82310.3.1 无参宏定义1.无参宏的宏名后不带参数其中的“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令。“define”为宏定义命令。“标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。在前面介绍的符号常量的定义就是一种无参宏定义。对于程序中反复使用的表达式进行宏定义。定义无参宏与定义常量的功能相似,它主要解决在代码中出现的重复代码处理,可以有效解决代码重用。这也是面向对象编程的基础思维方式。形式:#define 标识符 字符串2022-8-82410.3.1 无参宏定义#inc
13、lude#includemain()int i;printf(请输入一个角度i=);scanf(%d,&i);printf(角度%d的正弦值为sin(%d)=%fn,i,i,sin(3.1415926*i/180);printf(角度%d的余弦值为cos(%d)=%fn,i,i,cos(3.1415926*i/180);【例10-3】输入一个角度数据,分别计算其中的正弦与余弦。2022-8-82510.3.1 无参宏定义#include#includemain()int i;printf(请输入一个角度i=);scanf(%d,&i);printf(角度%d的正弦值为sin(%d)=%fn,i
14、,i,sin(3.1415926*i/180);printf(角度%d的余弦值为cos(%d)=%fn,i,i,cos(3.1415926*i/180);#include#include#define PI 3.1415926main()int i;printf(请你输入一个角度i=);scanf(%d,&i);printf(角度%d的正弦值为sin(%d)=%fn,i,i,sin(PI*i/180);printf(角度%d的余弦值为cos(%d)=%fn,i,i,cos(PI*i/180);2022-8-82610.3.1 无参宏定义2.字符串处理方式 宏定义的标准概念是处理一个表达式或字符
15、串,前面所演示的效果是最简单的案例,用于替代程序中可能出现了一个常量情况。#define demo(x*x*x+2*x)它表示定义demo表达式(x*x*x+2*x)。在编写源程序时,程序代码中所有的(x*x*x+2*x)都可由demo代替,而对源程序作编译时,将先由预处理程序进行宏代换,即用(x*x*x+2*x)表达式去置换所有的宏名demo,然后再进行编译。在正式编程的时候,习惯上为了区别与标准的变量定义,通常用大写字母定义宏的名称。编译系统本身并不需要考虑大小写,只是为了阅读方便。就如同变量名称建议“见名识义”,使用sum与使用a都可以用于表示累加,但很明显使用“sum”比“a”在概念的
展开阅读全文