8.2.1 文件包含

所谓“文件包含”,是指一个文件可以将另外一个文件的全部内容包含进来,也就是将另外的文件包含到本文件中。C语言中,通过#include命令来实现。其一般形式如下:

虽然可以用#include把任何一个其他文件的内容包含到当前文件中,但是在C语言中,最常见的做法还是一些源程序文件(扩展名为.c或者.cpp等)用#include把一些头文件(扩展名为.h或者.hpp等)包含进来,这种包含的感觉如图8.2所示。

图8.2 用#include将head.h内容包含到a.cpp中

在图8.2中,a.cpp源程序文件中原有的内容为A,最上面有一个#include "head.h",这意味着head.h文件中的内容B也属于a.cpp,所以最终a.cpp的完整内容应该是内容B在上面(因为#include语句在上面),内容A在下面,要认识到,使用了#include之后,就等价于把其他文件的内容包含到当前文件中来,所以当前文件的程序代码长度增加了。

#include命令非常有用,可以节省大量的重复劳动,可以把一些公用的内容写成一个文件,如前面讲过的宏定义,就可以写成一个公用文件(一般是一个.h头文件),然后每个其他的源程序文件都通过#include命令将这个公用文件包含进来。

一般来说,#include都是#include一个.h文件,很少出现#include一个.cpp(源程序文件)的情形。

前面章节曾经说过,.h文件一般称为头文件,因为h代表head(头)的意思。常把一些宏定义、函数说明,甚至一些公共的#include命令、外部变量说明(extern)等,都写在一个.h头文件里,然后在源程序文件中#include这个.h文件即可。随着读者以后书写程序的增多,慢慢会看到和体会到,有很多内容是可以写到.h文件中并被#include到源程序文件中去的。

可以做个演示,在与MyProject.cpp相同的文件夹下,创建一个head.h文件。内容如下:

在MyProject.cpp源程序文件中,内容大概如下:

这里有几点说明:

(1)虽然很多公共内容都可以写到这个.h文件中,但是一旦修改了这个.h文件,也就相当于修改了#include这个.h文件的所有源程序文件(.cpp文件),那在编译的时候这些源程序文件显然就得重新编译了(花费比较多的编译时间),因为一旦修改了源程序文件内容,Visual Studio会进行自动检测和重新编译。

(2)一条#include命令只能包含一个文件,如果要#include多个文件,可以使用多条#include命令。例如:

(3)#include一个.h文件,该.h文件内是可以#include其他.h文件的,非常灵活,也就是说,文件包含是可以嵌套的。读者只需要记住#include的工作原理就不会感觉困惑,#include命令的本质就是把另外一个文件中的内容搬到当前使用了#include命令的文件中来,并且搬到的位置,正是当前#include命令所在的位置。

(4)前面提过,#include所包含的文件名可以用"",也可以用<>,它们有什么区别吗?回忆一下:

· <>是去系统目录(Visual Studio知道系统目录在哪儿)中找所包含的文件,所以诸如要包含标准的stdio.h头文件(系统提供的)就用<>,如#include<stdio.h>。

· ""的含义是首先在当前目录查找要包含的文件,如果找不到,再到系统目录中查找。所以""常用于自己写的一些想被其他文件#include的文件,让系统优先到当前目录中寻找所要包含的文件(因为自己写的这些被包含文件往往会放到当前目录)。