为什么.h文件包含在.cpp文件中,而不是相反
Why are .h files included in .cpp files and not vice versa?
似乎没有一个合适的方法来谷歌这个,所以这是我的问题:
.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的文档。它们应该包含关于链接多个目标文件的信息。
- 从对象文件(.o)在macos上制作归档文件(.a文件)
- 有没有办法读取C++中的文件文件夹?
- 错误C1083:无法打开包含文件.文件正确包含在代码中
- NDK 无法看到头文件 .h 文件
- 文件文件夹关联或归属
- 如何在 rstudio 上为在子目录内的 src 文件夹中使用 C/C++ 文件的包构建和加载共享库
- 如何以阻止的方式删除文件/文件夹
- 在MFC中序列化为Unicode文本文件-文件头错误
- (Qt C++)如何从QTableView将所选文件/文件夹打印到文本文件中
- 获取带有POCO的服务可执行文件文件夹
- 如何从文件文件夹创建自定义文件类型
- 如何在windows7有限内存的电脑上读取大文件?文件大小为25GB,但RAM容量只有16GB
- c++以二进制方式读取文件.文件结束的问题
- 如何在linux的makefile中使用头文件(.h)文件中定义的宏定义
- Python的氧:一个段落记录文件和包
- 如何从文件夹中读取文件?文件夹包含不同类型的文件名
- 如何查找指向文件/文件夹的所有硬链接和符号链接(Windows和UNIX)
- 生成临时文件/文件夹 c++ GTEST
- 更改应用程序文件(. c文件)的名称
- 使用vc++2010从usb读取文件/文件夹