C++:预处理/文件包含处理

来自Peter_Matthew的Wiki

所谓“文件包含”处理是指一个源文件可以将另外一个源文件的全部内容包含进来,即将另外的文件包含到本文件之中。
C++提供了#include命令用来实现“文件包含”的操作。

文件包含的作用

“文件包含”的作用是将一份代码复制到另一份代码中,例如

a.cpp b.cpp 使用了“文件包含”的b.cpp
代码片段A 代码片段A
代码片段B
#include"a.cpp"
代码片段B

“文件包含”可以节省程序设计人员的重复劳动时间。

#include命令的应用很广泛,绝大多数C++程序中都包括#include命令。现在,库函数的开发者把这些信息写在一个文件中,用户只需将该文件“包含”进来即可(如调用数学函数的,应包含cmath文件),这就大大简化了程序,写一行#include命令的作用相当于写几十行、几百行甚至更多行的内容。这种常用在文件头部的被包含的文件称为“标题文件”或“头部文件”。

头部文件一般包含以下几类内容:

  1. 对类型的声明。
  2. 函数声明。
  3. 内置(inline)函数的定义。
  4. 宏定义。用#define定义的符号常量和用const声明的常变量。
  5. 全局变量定义。
  6. 外部变量声明。如entern int a;
  7. 还可以根据需要包含其他头文件。

两种形式

“文件包含”处理的#include命令的一般形式为

#include<文件名>

#include"文件名"

#include<iostream>

#include"iostream"

都是合法的。

其区别是#include<文件名>会直接按系统指定的目录检索,然后再在文件所在目录检索;#include"文件名"会先在文件所在目录检索,然后再按系统指定的目录检索。但两种检索的后一次检索会让编译效率下降,所以应该按照上述说明,优先使用对应的文件包含方法。
因此,应当使用#include<iostream>而不是#include"iostream",应当使用#include"a.cpp"而不是#include<a.cpp>。

关于C++标准库

C++的库除了保留C的大部分系统函数和宏定义外,还增加了预定义的模板和类。但是不同C++库的内容不完全相同,由各C++编译系统自行决定。
C++标准将库的建设也纳入标准,规范化了C++标准库,以便使C++程序能够在不同的C++平台上工作,便于互相移植。
C++标准库中的头文件一般不再包括后缀.h,例如#include<string>
但为了使大批已有的C程序能继续使用,许多C++编译系统保留了C的头文件,即提供两种不同的头文件,由程序设计者选用。

#include<iostream.h> //C形式的头文件
#include<iostream>   //C++形式的头文件

效果基本上是一样的。
建议尽量用符合C++标准的形式,即在包含C++头文件时一般不用后缀。
如果用户自己编写头文件,可以用.h为后缀。