【问题标题】:Why doesn't library source file include its header为什么库源文件不包含它的头文件
【发布时间】:2017-09-12 04:11:10
【问题描述】:

我目前正在尝试探索 OpenCV。

当我查找 Mat 类时,我可以看到它是在 mat.hpp 中定义的,它位于包含文件夹中。但是,当我尝试搜索其对应的mat.cpp 时,发现类定义实际上位于matrix.cpp。我想文件名的差异不是问题,只要它包含mat.hpp。但是,标题 mat.hpp 也不包括在内。我知道编译器可能仍然能够编译,但据我所知,这是一种糟糕的编程习惯。

所以,我的问题是,不将头文件包含在源文件中是否是一种不好的做法?有什么理由不应该包含它?

我知道关于库的详细实现我不需要过多探讨,但这个问题只是出于好奇。

这是matrix.cpp#include 部分

#include "precomp.hpp"
#include "opencl_kernels_core.hpp"
#include "bufferpool.impl.hpp"

这是mat.hpp#include部分

#include "opencv2/core/matx.hpp"
#include "opencv2/core/types.hpp"
#include "opencv2/core/bufferpool.hpp"

【问题讨论】:

  • 一开始你说的是“Mat class is defined in mat.hpp”。紧接着你说“我发现类 definition 实际上位于matrix.cpp”。这似乎是自相矛盾的。同样,definition 类在哪里?
  • 对不起,我在这里用错了词。 Mat 在 mat.hpp 中声明,未定义

标签: c++ opencv


【解决方案1】:

简短的回答是:项目就是这样发展的。

长答案是:OpenCV 确实(并且仍然)在 core.hpp 中声明了它的许多函数和类,而许多 .cpp 文件包含实现。在这种情况下,特定于矩阵的函数(以及Mat 的实现)将位于matrix.cpp 中,而类的定义(例如Mat)将位于core.hpp 中。

随着项目的发展,事情似乎变得分散(可能只是为了更容易管理)。您可以在this 提交中看到,Mat 类已从core.hpp 移出到它自己的mat.hpp 中(这样命名可能与类名匹配)。源文件matrix.cpp 确实包含mat.hpp,尽管是间接的(通过precomp.hppcore.hpp)。

我不认为这种混淆是故意的,只是偶然的。这是不好的做法吗?有些人会这么说,但这取决于你。

免责声明:我没有研究过 OpenCV 源代码,但确实广泛使用了一段时间。

【讨论】:

  • 感谢您的回答。但是为什么他们在这里间接包含?为什么不直接包含“mat.hpp”?
【解决方案2】:

在 C++ 中,当您在头文件中定义类,然后在 .cpp 文件中定义类成员(方法等)时,该类定义应该在该 .cpp 文件中可见。这通常通过将带有类定义的头文件包含到定义成员的.cpp 文件中来实现。

在 OpenCV 中,mat.hpp 间接包含在 matrix.cpp 中。 matrix.cpp 包括precomp.hpp,而core.hpp 又包括mat.hpp

所以,mat.hpp 实际上包含在matrix.cpp 中。这里没有什么不寻常的。

附:文件名没有任何作用。 mat.hppmatrix.cpp 被命名为“不同”并没有什么不寻常的地方。

【讨论】:

  • 感谢您的回答。但是为什么他们在这里间接包含?为什么不直接包含“mat.hpp”?
  • @Le Hoang Long:中间标头的名称 - precomp.hpp - 明确表明他们这样做是为了进行标头预编译。显然,所有广泛且经常使用的标头都应该通过预编译的precomp.hpp 包含在内。
  • 啊,我明白了。这样管理头文件会更容易,因为它们现在只需要包含 precomp.hpp
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
  • 1970-01-01
相关资源
最近更新 更多