2.3 编译多文件程序

一个程序可以分为几个文件。这样会是程序更容易编辑和理解,特别是当程序很大时--它也可以单独编译程序的不同模块。

在下面的例子中我们将Hello world程序分为三个文件:'main.c','hello_fn.c'和头文件'hello.h'。这是主程序'main.c':

include "hello.h"

int

main (void)

{

hello ("world");

return 0;

}

先前'hello.c'中的系统调用printf被替换为一个新的外部函数hello,这个函数在'hello_fn.c'中定义。

主程序也包含头文件'hello.h'这个头文件中包含hello函数的声明。这个声明用于确定调用函数时传递给函数的参数和返回值类型与函数定义时的参数和返回值一致。

我们不再需要包含系统头文件'stdio.h'在'main.c'中来声明函数printf,因为'main.c'不在直接调用printf函数了。

'hello.h'文件中的声明只有一行用于指定hello函数的类型:

void hello (const char * name);

hello函数自身的定义包含在'hello_fn.c'文件中:

include

include "hello.h"

void

hello (const char * name)

{

printf ("Hello, %s!\n", name);

}

这个函数使用参数name的值来打印"Hello,name!"字符串。

include "FILE.h" 和 #include 这两种格式的不同是前一种格式首先在当前目录下查找此文件然后在查找系统头文件目录。#include 这种格式只会查找系统头文件默认不会查找当前目录。

使用gcc编译这些文件使用如下命令:

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

在这个例子中我们使用'-o'选项指定一个不同的可执行文件'newhello'。注意头文件'hello.h'没有在命令行中指定。编译器会在适当的时候自动包含'hello.h'文件。

键入程序路径名来执行程序:

$ ./newhello

Hello, world!

程序的所有部分都会包含在一个可执行文件中,程序执行的结果和之前的单源文件程序的结果一样。