上一页 下一页

C 编程基础

制作库

由于上一个程序中的 `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 的信息。