即使我们有.h文件,C 何时包含CPP
c++ when to include cpp even if we have .h file
我正在阅读《绝对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
用于源文件可能是将它们全部融合到单个构建目标的粗略方法。
- 何时在抽象类 cpp 中声明受保护的字段
- 安卓项目中 jni 和 cpp 包之间的区别
- 何时需要 #include .cpp 文件?
- 模板参数包何时推断为空?
- AWS CPP S3 开发工具包是否支持"传输加速"
- 通过RTP CPP使用FFMPEG库发送视频流时,数据包掉落
- AWS-开发工具包-CPP:未解析的符号
- 如何使用适用于 S3 的 AWS 开发工具包 cpp 异步 API?
- 如何在 cpp 中使用味精包序列化嵌套消息
- 何时使用多个CPP文件(良好的编码实践)
- Dynamic_cast何时返回0,什么时候引发异常?CPP
- 即使我们有.h文件,C 何时包含CPP
- 将CPP-Netlib集成到预先存在的Boost软件包
- 未在 Windows 8.1 上构建的节点包 - 缺少 Microsoft.Cpp.Default.props
- 在包含 R/Cpp 代码的 R 包中使用 roxygen2 for R 函数
- 如何在使用WSARecv()和IOCP时知道套接字何时接收到FIN数据包
- RcppEigen - 从内联到包中的.cpp函数和"Map"
- 何时在foo.cpp中包含foo.h
- cpp 向量中的内存何时解除分配
- visual studio 2012 - c++最佳实践-我应该何时将我的项目分成.h和.cpp文件