我尝试查找此内容并使用头文件等得到混合结果。
基本上,我有多个 .cpp 文件,其中包含我为使用二叉树、 BST 、链表等而制作的所有函数。
我不想复制和粘贴我需要的函数,我只想能够做一个:
#include <myBSTFunctions.h>
并且能够调用和使用我自己的函数。
有哪些步骤来实现这一点?用我使用的所有函数原型制作一个头文件?
我应该将所有实际功能的 .cpp 和头文件放在哪里?
有没有办法直接调用函数文件的目录?
即,我更想将它与主要源 .cpp 文件放在同一个文件夹中,以便与我的一些同事共享。
我怎样才能做到这一点?
在 Windows 和 MinGW 编译器上。
原文由 Emrit 发布,翻译遵循 CC BY-SA 4.0 许可协议
这篇文章是对现有答案的补充答案,这些答案没有解决一个非常常见的问题(尤其是在初学者中):包括在单独的源文件中实现的模板的头文件。
自从:
我想指出其他答案中未提及的一个常见问题。考虑以下两个文件:
文件
class.hpp
:文件
class.cpp
:尝试实例化一个
Class
对象,或调用square()
:编译:
问题
1. 模板
想象一下你有这个功能:
你这样称呼它:
当编译器创建函数实现的副本时(即编译器看到对
add()
的调用时):然后你的电话将变成:
这显然意味着模板函数实现必须在找到调用时对编译器可见,因此编译器将能够对其进行复制。为了让编译器找到/看到它,它必须在同一个 翻译单元 中。
这就是模板魔法在幕后工作的方式。有关更多信息,请参阅 此答案。
2. 编译器和链接器
完成编译步骤:
#include
指令替换为包含的文件内容。.cpp
文件(也称为“翻译单元”)。结果将是每个单元的目标文件。请注意,某些代码(如main.cpp
中的代码)是指另一个代码(class.cpp
)。这将在下一步中解决。应用上面的步骤 1,我们将有两个翻译单元(
.cpp
文件):文件
class.cpp
:文件
main.cpp
:应用上面的步骤 2,我们将只有地址(这不是真实目标代码的样子,它只是一个简化):
文件
class.cpp
:文件
main.cpp
:应用上面的步骤 3,您将得到
undefined reference
错误:链接器不知道任何翻译单元中的任何fn100017()
。因为square()
是一个模板(或模型),编译器没有生成任何具体的实现。这同样适用于Class
。解决方案
main.cpp
中时,编译器都可以看到它们,因为它们在同一个翻译单元中。文件
class.hpp
:文件
class_impl.hpp
:使用相同的命令编译和运行
main.cpp
: