资源描述
*,计算机软件教学中心,http:/ 编译预处理,编译预处理,(,Preprocessor,),编译器根据源程序中的编译预处理指令对源程序文本进行相应操作的过程,编译预处理指令都以,“,#”,开头,它不是,C,语言语句,结尾不带“,;”,号,三种编译预处理指令,文件包含,(,Including files,),宏定义,(,Macro Definition,),条件编译,(,Conditional Compilation,),4,文件包含,头文件,(,Header File,),主要的作用是保存程序的声明,包括:功能函数原型、数据类型的声明等,如:,stdio.h,、,math.h,、,string.h,等。,文件包含指令的一般格式为:,#include,到编译系统指定的标准目录(,include,)下去查找该头文件,若没有找到就报错。多用于包含,标准头文件,。,#include,头文件名,“,首先到当前工作目录中查找头文件;若没找到,再到查找编译系统指定的标准目录中查找。多用于包含,用户自定义的头文件,。,5,宏定义,宏定义,将一个标识符定义为一个字符串。,在编译预处理时,源程序中的该标识符均以指定的,字符串来代替,。,宏定义也称为,宏替换,。,宏定义指令分为:,无参宏指令,带参宏指令,6,宏定义,无参宏指令,#define ,例,9.1,无参宏指令应用示例,7,#define PI 3.14159,/*无参宏定义1,符号常量*/,#define ISPOSITIVE 0,/*无参宏定义2*/,#define FORMAT Area=%fn,/*无参宏定义3*/,#define ERRMSG Input error!n,/*无参宏定义4*/,思考题:若在本例宏定义命令的后面都加上“,;”,号,程序是否还能正确编译?,宏定义,带参宏指令,#define (),例,9.2,带参宏指令应用示例,8,#define SUB(a,b)a-b,/*带参宏定义*/,c=SUB(a,b);,/*替换为:c=a-b;*/,c=SUB(3,1+2);,/*,替换为:,c=3-1+2;,结果不为,0,*/,思考题:如何修改本例宏定义使得,SUB(3,1+2),的结果为,0,?,宏定义,取消宏定义指令,#undef ,例如:,#undef PI,表示取消标识符,PI,的宏定义,9,条件编译,条件编译指令格式,1,:,#ifdef ,#else,#endif,例,9.3,条件编译指令应用示例,用于程序的调试信息的输出,10,条件编译,条件编译指令格式,2,:,#ifndef ,#else,#endif,可以用来防止头文件的重复包含,具体下面,9.2,节介绍,11,9.2,多文件工程程序,多文件工程程序,(,Project with Multiple,Source Files,),程序代码按一定的分类原则被划分为若干个部分,也称为模块,(,Module,),优势:,使程序结构更加清晰,便于程序的分工协作开发,便于程序的维护,12,多文件工程程序的组织结构,将不同的功能和数据结构划分到不同的模块中,不同类型的程序放在不同的(,.c,)源文件中,将函数的定义和使用相分离,将函数的定义从程序其他代码中分离出来,单独存放,有利于函数的重用,将函数的声明和实现相分离,将函数的原型声明放在一个(,.h,)头文件中,将函数的具体实现放在另一个(,.c,)源文件中,13,多文件工程程序的组织结构,例,9.4,设计一个多文件工程程序,其功能是计算圆和矩形的面积和周长。,在,VC+,环境下分析程序结构,并运行之。,14,注意:,main.c,中,#include“circle.h”,等使用了双引号,注意:,circle.h等中使用了条件编译指令,,防止,函数被重复声明,外部变量与外部函数,在一个程序文件中定义的变量或函数被其他程序文件所使用,外部变量,(,External Variable,),extern ;,外部函数,(,External Function,),extern ;,15,外部变量与外部函数,例,9.5,外部变量与外部函数示例,16,A.c,extern,void fb();,extern,void fc();,int x=0;,B.c,extern,int x;,void fb(),C.c,extern,int x;,void fc(),思考题:若,B.c,文件中删除外部变量声明语句“,extern int x;”,程序是否还能正确编译?,静态全局变量与静态函数,限制所定义的变量或函数只能在本文件中使用,而其他文件不能访问。,静态全局变量,(,Static Global Variable,),static ;,静态函数,(,Static Function,),static ;,17,思考题:修改例,9.5,将,A.c,中变量,x,的定义改为,static int x=0;,将,B.c,中函数,fb(),定义前加上,static,重新编译程序,结果如何?,9.3 应用举例多文件结构处理数组问题,例,9.6,设计一个多文件工程程序,实现对一维数组的输入、输出、统计、查找等。,在,VC+,环境下分析程序结构,并运行之。,18,模块化程序设计思想,(,Modular Programming,),:,自顶向下、,逐步分解、,分而治之,19,输入理想的程序,输出快乐的人生,
展开阅读全文