即使我们有.h文件,C 何时包含CPP

c++ when to include cpp even if we have .h file

本文关键字:何时包 CPP 文件 使我们 我们有      更新时间:2023-10-16

我正在阅读《绝对C 》第5版。在第716页中我真的不明白为什么它需要包括" pfarray.cpp"

包括" pfarray.h"不够吗?

更具体地说,即使我们在.h文件中有声明,但在.cpp文件中的实现,当我们仍然必须包括.cpp文件时?

预先感谢您。

您不必。

翻译单元是一组具有定义和声明的文件。编译翻译单元,编译器需要了解有关声明的所有信息,并一次又一次地重新批准它们。另一方面,可以仅编译一次定义并重复使用另一个单位。

可以在.h.cpp文件中分开翻译单元。您应该将声明和.cpp文件中的定义放在遵守一个定义规则中。这种方法还减少了汇编时间。

编写template-d类和函数(没有专业化),一些编码器(我认为是一个坏习惯)将将实现放在.cpp文件中,并且必须在其相应的.h文件的末尾或将它们包含在CC_5文件中或需要它们的.cpp文件。这只是令人困惑。一个更好的命名约定是将这些类型的.cpp文件重命名为.impl.cpp,并在其.h文件的末尾包括它们。

编写#include anything.any_extension时,扩展程序对预处理器并不重要。真的就像是"从该文件中获取内容并将其粘贴到该文件中" 的野蛮机制。因此,只要内部的代码是合法的,就可以包含任何没有错误的内容,并且可以将标头文件命名。因此,您甚至可以用.txt扩展名来命名它们,这对预处理程序并不重要。

我建议包含源文件的实践相当令人困惑,主要是从构建的角度来看,因为尚不清楚是否应该将源文件(CPP,CC等)作为单独的对象文件构建以链接反对或包括#complud或两者。

但是有时还是有时会做。例如,pfarray.cpp可能包含模板的实现同一标头文件一致符合一种样式,该样式有利于将所有此类详细信息放入源文件约定的文件中。

可以做到这一点的另一个原因,但是我认为这不是您的情况下这样做的原因(请参阅Unity Builds)。有时可以更有效地编译和链接较少的文件,因此将#include用于源文件可能是将它们全部融合到单个构建目标的粗略方法。