为什么.h文件包含在.cpp文件中,而不是相反

Why are .h files included in .cpp files and not vice versa?

本文关键字:文件 文件包 cpp 为什么      更新时间:2023-10-16

似乎没有一个合适的方法来谷歌这个,所以这是我的问题:

.cpp文件包括。h文件。假设我在range_search。h中定义了一个类,并在range_search。cpp中实现它。如果我想从另一个cpp文件中使用它,则不会,我再次包含range_search.h。无论如何,这似乎是正确的礼仪。通过这种方式,我没有在任何地方包含.cpp文件,目前我的代码抱怨没有找到其中的函数。我做错了什么?

最好的,提前感谢!亚历克斯

编辑:As per wish:

range_search.h:

#ifndef RANGE_SEARCH_H_
#define RANGE_SEARCH_H_
namespace range_search {
template<class Point>
class RangeSearch {
 public:
    using value_type = Point;
    virtual void assign(const std::vector<Point>& points) = 0;  
};
}  // namespace range_search
#endif  // RANGE_SEARCH_H_

range_search.cpp:

#include "range_search.h"
namespace range_search {
    /// Sets the underlying set.
    void assign(const std::vector<Point>& points){
        //doing stuff
    }  
}

main.cpp:

#include "range_search.h"
using Point = std::array<double, 2>;
int main(){
    //initialize some points
    range_search::RangeSearch<Point> r();
    r.assign(points);
}

错误是德文:

Fehler: Abfrage des elements»assign«in»r«,from night - klassentyp»range_search::RangeSearch>()«list

r.assign(点);

据我所知,这是因为main.cpp没有链接到range_search.cpp

这似乎是正确的礼仪。这不是礼仪的问题,但.cpp文件被认为是翻译单元,并被任何像样的编译器或构建系统处理。

.h文件包含所有需要在其他翻译单元中使用的声明。

编译后的.cpp文件在最后的链接阶段被拼接在一起。

通过这种方式,我没有在任何地方包括.cpp文件,目前我的代码抱怨没有找到其中的函数。我做错了什么?

您可能错过了正确链接生成的目标文件的最后一部分。


至于你的编辑:

现在显示的是一个模板声明,这是一个更特殊的情况。编译器需要看到模板定义才能正确地实例化它们。

你可以在这里阅读更多细节:为什么模板只能在头文件中实现?

这归结为c++(以及C)的构建方式。编译器会将.cpp文件编译成目标文件(通常是.o或.obj)。链接器然后将多个目标文件链接成一个二进制文件(可执行文件或库文件)。

你的编译器(实际上是链接器)抱怨它找不到你调用的函数的定义,因为这些目标文件没有包含在链接中。或者从你的问题看来,没有实际的错误很难说(将来,请包括实际的错误消息)。

我们包含。h文件,所以各种东西(类,函数等)的声明(通常不是定义)对编译器是可见的。如果你不包括这些,编译器会抱怨在这些头文件中声明的东西没有声明,所以它不知道它们应该是什么。

我会试着找到一些关于这个的文档。目前,请检查编译器/IDE的文档。它们应该包含关于链接多个目标文件的信息。