构建大规模程序注意要点(C语言)

在实际应用中,大多数程序往往由多个文件构成,这些文件包含若干源文件和头文件。源文件包含程序中被调用的定义和外部变量,而头文件包含可以在源文件之间共享的信息。

头文件

#include指令的使用

如果程序中有多个文件要访问同样的信息,就要将这些信息写在文件中,然后利用#include指令把这个文件中的内容插入每个源文件中。
#include指令有两种格式。第一种格式用于C语言标准库的头文件:

#include<stdio.h>
#include<string.h>

第二种格式用于所以其他头文件,包括程序员自己编写的头文件,不如A.h和B.h头文件:

#include“A.h”
#include“B.h”

定义共享类型和宏

大规模程序一般包含用于多个源文件共享的类型定义和宏定义。这些类型定义和宏定义一般放在头文件中。

#define BOOL int
#define TRUE 1
#define FALSE 0

例如,假如我的多个源文件需要使用到上述宏定义,只需要建议一个名为boolean.h的头文件。然后在需要使用这些宏定义的源文件开头简单地包含下面一列语句:

#include “boolean.h”

就可以在这些源文件中使用这些文件中定义的宏。
在头文件中定义共享宏和类型有许多优点:首先,不用把宏定义和类型复制给需要的源文件;其次,程序变得易于修改,改变宏定义和类型定义只需要修改相应的头文件即可;最后,避免由于源文件包含相同宏或类型的不同定义而导致的矛盾。

共享函数原型

共享函数原型和共享宏是同样的道理,只不过编写在头文件的换成了函数声明而已。如果我们有多个文件需要使用函数f(),我们只需要把f()的原型放在f1.h文件,然后多个源文件引用f1.h即可。

保护头文件

假如a文件包含头文件b,c文件也包含头文件b,而D文件包含了a文件和c文件,这样在编译的过程中,就会编译两次b文件,因为a和c都含有b文件,这是会产生编译错误的。当我们文件比较少的时候,我们可以分得清,但是当文件多了起来,很有可能就会出现重复引用的错误。
为了避免头文件被多次包含而产生编译错误,C系统使用#ifndef和#endif指令来把文件的内容封闭起来。例如,可以用如下方式包含头文件boolean.h:

#ifndef BOOLEAN_H
#define BOOLEAN_H

#define BOOL int
#define TRUE 1
#define FALSE 0
#endif

这段程序的意思是,如果BOOLEAN_H没有定义,那就定义以下三个语句。如果BOOLEAN_H已经被定义了,那就不用管了,直接跳过。宏BOOLEAN_H的名字往往与头文件的名字boolean.h类似,一般都是自己任意定义的。

构建多文件程序

编译

在集成开发环境当中,编译也就是一个按钮可以完成的工作。当编译完成后,编译器将产生一个新文件,这个文件包含来自每个源文件的目标代码,因而被称为目标文件。目标文件在Linux/UNIX系统中的扩展名为.o,在DOS系统中的扩展名为.obj(如Visual C++6.0 编译产生的目标文件扩展名为.obj)。

链接

编译产生的目标文件不能被计算机直接执行,属于中间文件,还需要通过链接器形成可执行程序。链接器的任务是把目标文件和库函数的代码连接成一个整体,生成一个可执行的程序。一般在集成开发环境中,编译和链接是一体的,通过点击某个图标就可以自动完成编译和链接。

在Linux系统中一般没有安装集成开发环境,都是通过命令行的形式。gcc就是常见的编译器,可以用下列命令行来构建程序:

%gcc -o fmt fmt.c line.c word.c

命令中的%是Linux提示符。该命令首先把三个源文件编译成目标代码,并分别储存在fmt.o、line.o、word.o的目标文件中。然后编译器会把目标文件传递给链接器,链接器会把这些文件结合成一个单独的可执行文件。选项-o告诉编译器需要的可执行文件的名字是fmt。

makefile文件

上述命令行虽然可以构建多文件程序,但比较麻烦。如果某些源文件发生了修改,就需要重新编译所有的源文件,从而导致浪费大量的时间。Linux/UNIX系统一般使用makefile文件。makefile文件不仅包含了程序部分的文件,而且描述了文件之间的依赖性。例如,对上述程序fmt在UNIX系统中使用makefile文件内容如下:

fmt:fmt.o word.o line.o
		gcc -o fmt fmt.o word.o line.o
fmt.o:fmt.c word.h line.h
		gcc -c fimt.c
word.o:word.c word.h
		gcc -c word.c
line.o:line.c line.h
		gcc -c line.c

上述命令有4组行,每组的第一行命令给出了目标文件,紧跟其后的是它的依赖文件。如果其中的一个依赖文件发生变化,造成目标文件需要重构,那么每组的第二行命令用来执行这一任务。
以第一组命令为例子:

fmt:fmt.o word.o line.o
		gcc -o fmt fmt.o word.o line.o

第一行说明fmt程序依赖于fmt.o、word.o、line.o文件,若上述三个文件任何一个发生变化,都需要重构fmt程序。这可通过第二行命令来进行重构。其他各组命令的功能相似。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值