说明
- 文件包含(文件导入)即在一个源码文件中将另外一个文件包含进来,以方便多文件编程和代码的复用,常见于头文件的包含。
- C/C++语言使用include宏来实现文件包含。
实现原理
- 编译是以单个源码文件为单位,编译过程的预处理阶段,预处理器处理到include宏时,会读取include文件中的所有内容拷贝到当前位置,替换掉include宏。
使用
- 先从当前路径查找文件,再到PATH环境变量保存的路径查找文件
#include "a.h"
- 先从PATH环境变量保存的路径查找文件,再到当前路径查找文件
#include <a.h>
注意点
- 文件包含不仅仅可以包含头文件,任何文件都能包含,只是二进制文件或无意义的字符文件会导致编译出错,include时并不会管文件后缀,都是内容拷贝,被包含文件后缀不一定要是.h,.c, .a, .b,甚至没有后缀都没关系。
- 文件包含支持多重路径,相对路径,绝对路径等,只要文件系统能访问到就行,例如:
#include "xxx/xxx.h"
C++头文件有后缀.h与无后缀的区别
- 有后缀的.h文件是c语言风格的头文件,早期c++是扩展的c语言的代码,因此风格也是采用c的,无后缀的头文件是c++风格的头文件,只是因为后期c++做了一些改变,为了和c以及早期的c++头文件区分开。
- 不管有无后缀本质都一样,都是文本文件,新版本c++ 也是可以包含有后缀的头文件的。
使用方式(个人经验)
- 头文件的路径有多种写法,例如:相对路径,绝对路径,相对源码根目录路径等,不同写法各有利弊。
- 使用源码文件的相对路径,例如:
#include "../xxx.h"
- 添加源码根目录到头文件查找目录,头文件包含时使用相对源码根目录的相对路径,例如:
#include "xxx/xxx.h"
- 使用头文件的绝对路径,例如:
#include "/home/xxx.h"
- 导致路径更改的可能情况
- 头文件路径发生变化
- 源码文件路径发生变化
- project整体路径发生变化
- 利弊
- 对于更改1(头文件路径发生变化),不管采用什么写法,引入路径都需要进行对应修改。
- 对于更改2(引入头文件的源码路径发生变化),写法1需要进行更改,并且该源码文件中的所有头文件路径都需要进行对应更改,非常麻烦;写法2和3都不需要更改。
- 对于更改3(project整体路径发生变化),写法3需要更改,并且所有源码文件中的头文件路径都需要修改,非常麻烦;写法1和写法2不需要修改。
- 综上所述,我们应该采用写法2,修改的可能性最小。
- 引申到其它语言,例如:go,java等,都正在采用或者应该采用相对模块根目录的相对路径;改进方式:工程细分为模块,减小模块的粒度。