C语言大型程序的项目管理与实现
当程序复杂时源代码会很长,如果把全部代码放在一个源文件里,写程序,修改、加工程序都会很不方便。程序文件很大时,装入编辑会遇到困难;在文件中找位置也不方便;对程序做了一点修改,调试前必须对整个源文件重新编译;如果不慎把已经调试确认的正确部分改了,又会带来新的麻烦。在实践中人们体会到:应当把大软件(程序)的代码分成一些部分,分别放在一组源程序文件中,分别进行开发、编译、调试,然后把它们组合起来,形成整个软件(程序)。C语言本身支持这种开发方式。当我们写的程序较大时,上述问题就会反应出来,因此应当学习“大程序”的开发方法。
把一个程序分成几个源程序文件,显然这些源文件不是互相独立的。一个源文件里可能使用其他源文件定义的程序对象(外部变量、函数、类型等),这实际上在不同源文件间形成了一种依赖关系。这样,一个源文件里某个程序对象的定义改动时,使用这些定义的源文件也可能要做相应修改。在生成可执行程序时,应该重新编译改动过的源文件,而没改过的源文件就不必编译了。在连接生成可执行程序时,要把所有必要的模块装配在一起。这些管理工作可以由人自己做,但是很麻烦。 TURBO C集成开发环境的项目管理功能能帮助我们处理这些问题。利用这种功能,开发大程序的工作将更加方便。今天的各种程序开发环境都提供了类似的管理功能。
用C语言写大程序,应当把源程序分成若干个源文件。其中有:
(1)一个或几个自定义的头文件,通常用 .h 作为扩展名。头文件里一般放:
#include预处理命令,引用系统头文件和其他头文件;
用#define定义的公共常量和宏;
数据类型定义,结构、联合等的说明;
函数原型说明,外部变量的extern说明;等等。
(2)一个或几个程序源文件,通常用 .c 作为扩展名。这些文件中放:
对自定义头文件的使用(用#include命令);
源文件内部使用的常量和宏的定义(用#define命令);
外部变量的定义;
各函数的定义,包括main函数和其他函数。
不提倡在一个 .c 文件里用#include命令引入另一个 .c 文件的做法。这样往往导致不必要的重新编译,在调试程序查错时也容易引起混乱。应该通过头文件里的函数原型说明和外部变量的extern说明,建立起函数、外部变量的定义(在某个源程序文件中)与它们的使用(可能在另一个源程序文件中)之间的联系,这是正确的做法。
使用TURBO C项目管理功能的方法是:
首先建立一个“项目文件”。本系统中项目文件用.PRJ作为扩展名。项目文件同样可以用编辑器建立,在这个文件中列出作为本项目组成部分的所有源程序文件的完整名字(包括扩展名),每行列一个,头文件不必列入。源文件的次序没有关系,第一个源文件的名字将被作为最后生成的可执行程序的名字。
在启动集成开发环境后,首先装入项目文件。用 Project菜单第一个命令完成这个工作。在此之后,编程工作的对象就是这个项目。
装入和修改源文件的方式不变。在一个源文件初步完成后,可以用Alt-F9或菜单编译命令对它进行编译,做语法检查,生成目标模块。这时还可能产生由于缺少必要外部定义而出现的错误。发现这种问题,应当修改有关头文件。
在各个源文件的分别初步编译调试后,用F9或菜单的Compile/Make项命令开发环境建立可执行程序。这时程序加工的工作对象是整个项目,如果系统发现某些目标模块不是最新的(源程序修改过),就自动对它们重新编译,最后把目标模块连接起来,生成可执行程序。编译中若发现源文件有错,所有的错误都将列在消息窗口,排错时系统能够对各个文件中的错误自动定位,如果被定位错误所在的文件不是当前文件,系统将自动装入相应的文件,并把亮条和光标放在正确位置。在这个加工过程中,还可能发现模块之间的关联错误,如变量函数的名字使用和定义不一致,方式不正确,变量函数的extern说明与实际定义不一致,等等。在Make过程中,系统利用源程序的时间信息,确定程序模块的前后时间关系,决定哪些模块需要重新编译,最后在连接时装入所有必需的模块。