
C语言程序设计第10章程序编译预处理课件.ppt
65页第1页,共65页程序设计技术基础(C语言)2022/8/42第10章程序预编译处理第2页,共65页程序设计技术基础-C语言2022/8/43 C语言是基于函数模式的编程语言,编译器在进行编译的时候,调用不同的函数完成整体的任务当它需要调用某个函数的时候,需要知道这个函数的函数原型(通常也叫函数声明)编译系统在获得的函数的基本信息中,要求有函数的入口地址、相关的参数等如果函数同时参与了其它的运算工作,例如赋值给一个指定的变量,编译系统还需要掌握该函数的返回数据类型这些相关的信息可以分别放在不同的头文件(H文件)中,系统在编译的过程中自动调用就可以第3页,共65页程序设计技术基础-C语言2022/8/44说明什么是宏定义及其运用宏定义宏定义说明文件包含的基本概念与具体运用方法文件包含文件包含说明条件编译的基本概念与具体运用方法条件编译条件编译通过案例说明如何使用预编译资源综合案例综合案例本章内容第4页,共65页程序设计技术基础-C语言2022/8/451 1C语言编译原理第第节节第5页,共65页程序设计技术基础-C语言2022/8/46 使用编辑器编写完成源代码,就可以调用C语言的编译器将源文件转换成机器码。
编译器在处理中,一个单元只包含一个源代码文件(.c程序)如果没有错误生成对应的目标文件(.obj文件)最终通过连接器将全部的目标文件进行组合后生成对应的可执行文件(.exe文件)交给操作系统执行在设计过程中可能会遇到一些代码需要重复执行,或某些参数、公式等频繁使用,为了便于程序设计,可以通过预定义方式设置成一些可以替换的代码第6页,共65页程序设计技术基础-C语言2022/8/47第7页,共65页程序设计技术基础-C语言2022/8/48sin(x)=?第8页,共65页程序设计技术基础-C语言2022/8/492 2文件包含命令#include第第节节第9页,共65页程序设计技术基础-C语言2022/8/410#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”第10页,共65页。
程序设计技术基础-C语言2022/8/411文件包含命令注意事项(1)包含命令中的文件名可以用双引号括起来,也可以用尖括号括起来例如以下写法都是允许的:#include stdio.h#include但是这两种形式是有区别的:使用尖括号表示在包含文件目录中去查找(包含目录是由用户在设置环境时设置的),而不在源文件目录去查找;使用双引号则表示首先在当前的源文件目录中查找,若未找到才到包含目录中去查找用户编程时可根据自己文件所在的目录来选择某一种命令形式2)一个include命令只能指定一个被包含文件,若有多个文件要包含,则需用多个include命令3)文件包含允许嵌套,即在一个被包含的文件中又可以包含另一个文件第11页,共65页程序设计技术基础-C语言2022/8/41210.2.1 调用方式1.基本调用方式#include#include 头文件名使用“”将指定的头文件(.h)文件加载到程序中,它指定的文件是在系统的安装目录中当要引用的头文件是标准的链接库头文件时应当采用此方法使用“”与“”将指定的头文件则用于自己定义的通用函数,在编写C代码的时候就需要注意定义方式与引用的方式第12页,共65页。
程序设计技术基础-C语言2022/8/41310.2.1 调用方式2.创建一个自己的头文件 在进行程序设计的过程中,我们可以自己创建一个专门的头文件(.h)来保存相应的函数声明,在其它的源文件(.c)中定义函数并调用函数在函数章节中曾经介绍,在C语言中只能有一个main()函数,但为了实现代码的重用功能,可以将重复出现的函数单独保存成源文件,在调用的时候,多个文件共同进行编译而使用头文件则可以直接使用这些定义的函数内容第13页,共65页程序设计技术基础-C语言2022/8/414#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;第14页,共65页程序设计技术基础-C语言2022/8/415第15页,共65页。
程序设计技术基础-C语言2022/8/416如果将系统提供的math.h加入main()函数会如何?导入的头文件中如果出现同名的函数会如何?思考题第16页,共65页程序设计技术基础-C语言2022/8/41710.2.2 C语言中典型的库文件 系统提供了丰富的系统文件,称为库文件,C 的库文件分为两类,一类是扩展名为“.h”的文件,称为头文件,在前面的包含命令中我们已多次使用过在“.h”文件中包含了常量定义、类型定义、宏定义、函数原型以及各种编译选择设置等信息另一类是函数库,包括了各种函数的目标代码,供用户在程序中调用通常在程序中调用一个库函数时,要在调用之前包含该函数原型所在的“.h”文件第17页,共65页程序设计技术基础-C语言2022/8/41810.2.2 C语言中典型的库文件典型的头文件ALLOC.H 说明内存管理函数(分配、释放等)ASSERT.H 定义 assert 调试宏BIOS.H 说明调用IBMPC ROM BIOS子程序的各个函数CONIO.H 说明调用DOS 控制台I/O子程序的各个函数CTYPE.H 包含有关字符分类及转换的名类信息(如isalpha和toascii等)。
DIR.H 包含有关目录和路径的结构、宏定义和函数DOS.H 定义和说明MSDOS和8086调用的一些常量和函数ERRON.H 定义错误代码的助记符FCNTL.H 定义在与open库子程序连接时的符号常量FLOAT.H 包含有关浮点运算的一些参数和函数第18页,共65页程序设计技术基础-C语言2022/8/41910.2.2 C语言中典型的库文件典型的头文件GRAPHICS.H 说明有关图形功能的各个函数,图形错误代码的常量定义,对应不同驱动程序的各种颜色值及函数用到的一些特殊结构需要注意的是此项功能只能运用在DOS编程中IO.H 包含低级I/O子程序的结构和说明LIMIT.H 包含各环境参数、编译时间限制、数的范围等信息MATH.H 说明数学运算函数,还定了HUGE VAL宏,说明了matherr和matherr子程序用到的特殊结构MEM.H 说明一些内存操作函数(其中大多数也在STRING.H中说明)PROCESS.H 说明进程管理的各个函数,spawn和EXEC函数的结构说明SETJMP.H定义longjmp和setjmp函数用到的jmp buf 类型,并说明这两个函数第19页,共65页。
程序设计技术基础-C语言2022/8/420典型的头文件10.2.2 C语言中典型的库文件SHARE.H 定义文件共享函数的参数SIGNAL.H 定义SIGZZ(Z ZZ)IGN 和SIGZZ(Z ZZ)DFL常量,说明rajse和signal两个函数STDARG.H 定义读函数参数表的宏如vprintf,vscarf函数)STDDEF.H 定义一些公共数据类型和宏STDIO.H 定义Kernighan 和Ritchie 在Unix System V中定义的标准和扩展的类型和宏还定义标准I/O预定义流:stdin、stdout和stderr,说明I/O流子程序STDLIB.H 说明一些常用的子程序:转换子程序、搜索与排序子程序等STRING.H 说明一些串操作和内存操作函数第20页,共65页程序设计技术基础-C语言2022/8/4213 3宏定义#define第第节节第21页,共65页程序设计技术基础-C语言2022/8/422在介绍C语言的基础定义时,我们知道常量的功能是为了便于程序的开发,对于程序中重复使用的数据或系统使用的语句可以定义为常量宏定义在一定意义上有些像常量的效果在基础的编程中,使用常量便于程序编写,而在高级编程中,使用宏定义方式表示更多的思想。
例如在语言源程序中允许用一个标识符来表示一个字符串,称为“宏”被定义为“宏”的标识符称为“宏名”在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”第22页,共65页程序设计技术基础-C语言2022/8/42310.3.1 无参宏定义1.无参宏的宏名后不带参数其中的“#”表示这是一条预处理命令凡是以“#”开头的均为预处理命令define”为宏定义命令标识符”为所定义的宏名字符串”可以是常数、表达式、格式串等在前面介绍的符号常量的定义就是一种无参宏定义对于程序中反复使用的表达式进行宏定义定义无参宏与定义常量的功能相似,它主要解决在代码中出现的重复代码处理,可以有效解决代码重用这也是面向对象编程的基础思维方式形式:#define 标识符 字符串第23页,共65页程序设计技术基础-C语言2022/8/42410.3.1 无参宏定义#include#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】输入一个角度数据,分别计算其中的正弦与余弦。
第24页,共65页程序设计技术基础-C语言2022/8/42510.3.1 无参宏定义#include#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);#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);第25页,共65页程序设计技术基础-C语言2022/8/42610.3.1 无参宏定义2.字符串处理方式 宏定义的标准概念是处理一个表达式或字符串,前面所演示的效果是最简单的案例,用于替代程序中可能出现了一个常量情况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,然后再进行编译在正式编程的时候,习惯上为了区别与标准的变量定义,通常用大写字母定义宏的名称编译系统本身并不需要考虑大小写,只是为了阅读方便。












