一个源程序可以分成几个文件。这样便于编辑与理解,尤其是程序非常大的时候。这也使各部分独立编译成为可能。

下面的例子中我们将程序 Hello World 分割成 3 个文件:‘hello.c’,‘hello_fn.c’和头文件‘hello.h’。这是主程序‘hello.c’:

#include “hello.h”
int main(void)
{
hello (“world”);
return 0;
}

在先前例子的‘hello.c’中,我们调用的是库函数 printf,本例中我们用一个定义在文件‘hello_fn.c’中的函数 hello 取代它。

主程序中包含有头文件‘hello.h’,该头文件包含函数 hello 的声明。我们不需要在‘hello.c’文件中包含系统头文件‘stdio.h’来声明函数 printf,因为‘hello.c’没有直接调用 printf。

文件‘hello.h’中的声明只用了一行就指定了函数 hello 的原型。

void hello (const char * name);

函数 hello 的定义在文件‘hello_fn.c’中:

#include <stdio.h>
#include “hello.h”

void hello (const char * name)
{
printf (“Hello, %s!\n”, name);
}

语句 #include “FILE.h” 与 #include <FILE.h> 有所不同:前者在搜索系统头文件目录之前将先在当前目录中搜索文件‘FILE.h’,后者只搜索系统头文件而不查看当前目录。

要用gcc编译以上源文件,使用下面的命令:

$ gcc -Wall hello.c hello_fn.c -o newhello

本例中,我们使用选项 -o 为可执行文件指定了一个不同的名字 newhello。注意到头文件‘hello.h’并未在命令行中指定。源文件中的的 #include “hello.h” 指示符使得编译器自动将其包含到合适的位置。

要运行本程序,输入可执行文件的路径名:

$ ./newhello
Hello, world!

源程序各部分被编译为单一的可执行文件,它与我们先前的例子产生的结果相同。