【问题标题】:Why would a .hpp file be included in a .h file? [duplicate]为什么 .hpp 文件会包含在 .h 文件中? [复制]
【发布时间】:2017-02-17 00:31:18
【问题描述】:

我的任务是实现一个类。我收到了一个名为“pro.h”的 .h 文件,我无法以任何方式对其进行更改。 .h 文件仅包含函数原型,没有定义。在 class 块之后,它有一个

#include "pro.hpp"

我应该创建一个 file.hpp 来添加定义,但我很困惑,因为定义通常包含在 .cpp 文件中,而不是另一个头文件中。你认为为什么会这样做?我是否会像在 .cpp 文件中那样格式化定义,或者重写头文件以包含定义(这似乎效率低下)。

【问题讨论】:

  • .h 文件、.hpp 文件或任何其他文件都没有什么神奇之处。编译器只是按照指示处理所有#include 文件。您的文件扩展名可以是.h.hpp.xyz.hjgiurejkcxkj。它仍然是有效的 C++,只要相关文件在被逻辑包含后包含有效的 C++ 代码。
  • 谢谢,我只是想确保编译器不会因为扩展而对它进行不同的编译。
  • @AlessandroLorusso 你(通常)不会自己编译头文件,所以没有问题。
  • 我猜测,你必须这样做的原因是你有一个不称职的老师。
  • 您应该使用称为模板的东西吗?

标签: c++ header definition


【解决方案1】:

您的老师希望您实现一个模板类。关于模板的问题是它们需要使用正确的模板类型进行实例化,这意味着您无法在知道它将是什么类型之前创建二进制文件。这就是为什么通常将实现写在头文件中的原因。看看 f.e. here...

如果您不熟悉模板,请询问叔叔google 或蚂蚁wiki ;)

添加:

简单地说...当您在foo.cpp 中有内容时,它会被转换为二进制文件,并且相应的标头foo.hpp 用作对二进制文件中有哪些函数的引用,我可以从其他函数中使用这些函数代码。重要的是这个二进制文件不再(真的)改变了。

另一方面,模板不能转换为二进制文件,除非你知道它将在什么类型上运行...如果你使用模板类一次 int 和另一次 vector<double>对于模板参数,生成的二进制文件可能会非常不同......因此,只有知道类型后才能将代码编译为二进制文件,因此您需要传递代码(在标头内)而不仅仅是函数原型...

希望这很清楚。毕竟这里已经是凌晨三点了。

如果没有,this 应该很全面。

【讨论】:

  • 这确实有很大帮助,谢谢
猜你喜欢
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
  • 2015-01-27
相关资源
最近更新 更多