创建一个函数库
上述程序中的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;
/* 摘自 K&R- 产生一个0至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
#include "util.h"
#define MAX 10
int a[MAX];
void main()
{ int i,t,x,y; /* 填充数组元素 */
for (i=0; i < MAX; i++)
{a[i]=rand(); printf("%dn",a[i]);}
bubble_sort(MAX,a); /* 打印排序后的数组 */
printf("--------------------n"); for (i=0; i < MAX; i++)
printf("%dn",a[i]); }
这个程序包含了该实用工具函数库。使用函数库的主要好处是主程序的代码被大大精简了。
函数库的编译和运行
要编译函数库,请在命令行键入如下命令(假设您使用的是UNIX。若您的系统用的是cc则用cc替换gcc):
gcc -c -g util.c
-c选项使编译器为函数库生成一个的目标文件,它包含了函数库的二进制代码,独立存在于名为util.o的目标文件中。目标文件只有在和一个包含主函数的程序文件链接后才能执行。
要编译主程序,请键入:
gcc -c -g main.c
此命令将生成一个文件名为main.o的目标文件,它包含了主程序的二进制代码。要创建包含整个程序机器代码的可执行文件,请键入下面的命令将两个目标文件链接:
gcc -o main main.o util.o
这条命令将main.o和util.o进行链接并生成可执行程序main。键入main后即可运行。
用makefile可以在一定程度上简化函数库的使用。