C++什么时候需要将#include写到头文件,什么时候需要写到cpp文件?

如题,有时候在定义一个类的时候可能需要用到其他的类,那么这个#include是放在头文件还是放在cpp文件?我目前只知道基类的头文件需要被包含在派生类…
关注者
92
被浏览
70,334

13 个回答

看你这个类怎么用,以及其他类是否作为接口出现。

若其他类需要作为接口(用到该类相关类型的参数),则需要放到这个类的头文件。

若这个类的实现可见,而其他类作为实现的一部分(成员或基类),则也需要放头文件。

否则,若这个类的实现不必可见(使用 pImpl ),而其他类也不作为接口,则其他类的头文件不必放进该类的头文件,只需放进源文件。


更泛化的放头文件还是源文件需要具体问题具体分析。

有时希望降低编译依赖或保持 ABI 兼容,就把尽量多的东西放源文件,头文件里不放类定义。

有时希望促进内联优化,就把尽量多的东西放在头文件(为此有些函数定义需要用 inline )。

个人观点,仅供参考。

先不考虑内联优化的问题(我选择相信LTCG)。


C++的编译模型就是一个cpp一个单元,所以只考虑单个cpp的话,include在哪其实都差不多(除非两相查找/宏定义/编译器指令等造成了影响)。

但一般来说不推荐放.h里,因为.h作为头文件,是要被其他文件包含的,所以你在a.h里加了一条include,意味着所有include了"a.h"的文件都会受到影响——每个编译单元的任务都变重了,而且一次改动会导致多个编译单元需要重新编译。


在考虑一下include的意义——编译器需要见到其他类的定义。

比如class A里有class B的成员,计算A的内存布局需要用到B的内存布局信息,所以就需要在定义class A前include B。

而如果只是有一个B*, 即指向B的指针(引用同理),由于指针大小是确定的,所以不需要B的内存布局,也不需要include B。这时候只要向前声明一个 class B就可以了。

而如果代码里使用了B的方法,那编译器也需要能在此之前看到该方法的定义,所以也需要include。


简单来说就是:

1.如果只是做做ACM,写写几个cpp的程序,那就不用操心这个了。

2.如果要做稍微复杂一点的程序,建议尽量把包含放在cpp里——反正如果你把需要出现在.h里的东西挪到了.cpp里,编译器自然会给你报错的。

3.如果要更复杂的项目,就把包含放在单独一个.h里——该用pch了。