制作库
由于上一个程序中的 `rand` 和 `bubble_sort` 函数很有用,您可能希望在编写的其他程序中重复使用它们。您可以将它们放入一个实用程序库中,以便于重用。
每个库都由两部分组成:一个头文件和实际的代码文件。头文件通常以 **.h** 为后缀,包含使用该库的程序需要了解的库信息。通常,头文件包含常量、类型以及库中可用函数的原型。输入以下头文件并将其保存到名为 **util.h** 的文件中。
广告
/* util.h */ extern int rand(); extern void bubble_sort(int, int []);
这两行是函数原型。C 语言中的“extern”关键字表示稍后将被链接的函数。如果您使用的是旧式编译器,请从 `bubble_sort` 的参数列表中删除参数。
将以下代码输入到名为 **util.c** 的文件中。
/* util.c */ #include "util.h" int rand_seed=10; /* from K&R - produces a random number between 0 and 32767.*/ int rand() { rand_seed = rand_seed * 1103515245 +12345; return (unsigned int)(rand_seed / 65536) % 32768; } void bubble_sort(int m,int a[]) { int x,y,t; for (x=0; x < m-1; x++) for (y=0; y < m-x-1; y++) if (a[y] > a[y+1]) { t=a[y]; a[y]=a[y+1]; a[y+1]=t; } }
请注意,该文件包含了它自己的头文件(**util.h**),并且使用了引号而不是符号 **<** 和 **>**,后者仅用于系统库。正如您所见,这看起来像普通的 C 代码。请注意,变量 `rand_seed` 因为不在头文件中,所以使用此库的程序无法看到或修改它。这称为信息隐藏。在 `int` 前面添加 `static` 关键字可以完全强制实现这种隐藏。
将以下主程序输入到名为 **main.c** 的文件中。
#include <stdio.h> #include "util.h" #define MAX 10 int a[MAX]; void main() { int i,t,x,y; /* fill array */ for (i=0; i < MAX; i++) { a[i]=rand(); printf("%d\n",a[i]); } bubble_sort(MAX,a); /* print sorted array */ printf("--------------------\n"); for (i=0; i < MAX; i++) printf("%d\n",a[i]); }
此代码包含了实用程序库。使用库的主要好处是主程序中的代码会大大缩短。
使用库进行编译和运行
要编译该库,请在命令行中输入以下内容(假设您正在使用 UNIX)(如果您的系统使用 `cc`,请将 `gcc` 替换为 `cc`)
gcc -c -g util.c
`-c` 选项使编译器为库生成一个目标文件。目标文件包含库的机器码。它必须链接到一个包含 `main` 函数的程序文件后才能执行。机器码位于一个名为 **util.o** 的独立文件中。
要编译主程序,请输入以下内容
gcc -c -g main.c
此行创建一个名为 **main.o** 的文件,其中包含主程序的机器码。要创建包含整个程序机器码的最终可执行文件,请通过输入以下内容链接这两个目标文件
gcc -o main main.o util.o
这会将 **main.o** 和 **util.o** 链接起来,形成一个名为 **main** 的可执行文件。要运行它,请键入 **main**。
Makefiles 使使用库变得更容易一些。您将在下一页了解有关 makefiles 的信息。