为什么没有库源文件包含其标题

时间:2017-09-12 04:11:10

标签: c++ opencv

我目前正在尝试探索OpenCV。

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

所以,我的问题是,不将头文件包含在源文件中是不正确的做法?是否有任何理由不应该包括在内?

我知道我不需要过多探讨图书馆的详细实施,但这个问题只是出于好奇。

以下是#include

matrix.cpp部分
#include "precomp.hpp"
#include "opencl_kernels_core.hpp"
#include "bufferpool.impl.hpp"

以下是#include

mat.hpp部分
#include "opencv2/core/matx.hpp"
#include "opencv2/core/types.hpp"
#include "opencv2/core/bufferpool.hpp"

2 个答案:

答案 0 :(得分:3)

简短的回答是:那是项目的演变过程。

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

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

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

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

答案 1 :(得分:3)

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

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

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

P.S。文件名不起任何作用。 import * as lib from "lib" import express = require("express"); “不同”地命名是没有异常的。