13.2 文件包含
文件包含通过编译预处理命令#include <header>或#include "文件名"来完成。其含义是把相应的标准头(header)或源文件的全部内容复制、粘贴、替代这条预处理命令。其中尖括号和双引号表示的含义差别在于,前者表示在编译器指定的特定位置中搜寻(2),而后者一般表示首先在源文件(.C)所在的位置查找相应的文件。
所包含的文件的格式必须和源文件的格式一样,即要求是文本文件。
由于代码编写者通常把自己编辑的被包含文件与源文件(.C)放在同一个文件夹中,所以使用自己编写的被包含文件时,一般使用双引号,使用编译器提供的库文件的头文件时,使用尖括号。
文件包含容许嵌套包含,比如文件A中包含文件B,文件B中包含文件C。
文件包含命令还有如下一种形式。
这种情况下,文件名是由“预处理单词组”得到的。这种形式多半结合条件编译预处理命令一同使用。
就目前来说,文件包含这条命令可以帮助我们把代码的规模减小一些。比如在第10章中,某些代码很长,可以考虑把那些代码分成两部分,main()函数前面的部分写成一个扩展名为.h的文件放在.c文件所在的文件夹中,这样.c文件会显得简洁一些。恐怕.h头文件的“h”(头)的由来恰恰就是缘于这个原因(代码开头部分,即header)。
这条命令从本书的一开始就使用了。最初是被迫使用的,因为某些头文件中包含着要用到的数据类型的定义和标识符的说明(函数原型和某些符号常量的定义)。然而这条预处理命令的意义不仅限于此,它还涉及程序开发的组织问题,这个问题非常重要。
正如懂得语法不等于会写代码一样,懂得#include命令的含义也绝对不意味着知道如何应用。#include命令本身是简单的,极易被理解的。然而真正恰到好处地应用它去有条理地组织程序的开发过程却是很难的事情。
其他的预处理命令也多半与程序的组织管理有着密切关系。为了综合性地说明编译预处理命令在程序组织管理过程中如何应用,下面将以一个具体的程序开发过程为载体,结合预处理命令,介绍程序的组织问题。
需要说明的是,离开了代码的规模,讨论程序的组织问题就几乎没有什么意义。因此下面的例子比较大,讲解的过程也比较长,中间还穿插着介绍其他一些预处理命令。读者需要有足够的耐心,并需要特别注意从整体上领略对程序的思考过程与代码组织的工作流程,具体的代码实现细节倒是次要的部分,可以留待最后学习或自己实现。