gpt4 book ai didi

c++ - LNK2005 错误通过在 .cpp 而不是 header 中定义来解决。为什么?

转载 作者:太空宇宙 更新时间:2023-11-04 16:11:39 25 4
gpt4 key购买 nike

所以我有一个旨在从文件中读取的函数。它是在 FileIO.h 中声明和定义的,如下所示:

std::string ReadFromFile(std::ifstream& in)
{
std::string out;
in >> out;
return out;
}

现在,我将这个 header 包含到另一个 header 中,该 header 本身包含在另一个 header 中,而另一个 header 又包含在 main 中。尽管它没有包含在多个东西中,但我的所有头文件都有 #ifndef-#def-#endif 预处理器,具有唯一的名称。

我终其一生都无法弄清楚为什么它仍然抛出链接器错误(事实上,它抛出了两次:一次在我的 Main 中,一次在第二个头文件中)。然后我尝试简单地在 FileIO.h 中声明该函数,如下所示:

std::string ReadFromFile(std::ifstream& in);

然后我在FileIO.cpp中定义了它。没有更多的链接器错误!这是因为我在函数中定义了变量,并且它们正在被编译然后稍后可以看到(例如 std::string out),还是来自其他东西?我很想上一堂关于为什么这样做的好课。谢谢!

最佳答案

您可能对您的包含守卫似乎没有工作这一事实感到困惑。这是拼图的缺失部分:

编译器根据各个翻译单元 处理您的代码。这只是“一个 .cpp 文件及其直接或间接包含的一组 header ”的奇特术语——重要的是每个 TU 都是独立于所有其他 TU 编译的。

当编译器处理例如main.cpp 它最终会看到您的 header ,并在生成的 main.obj 中包含一个已编译的 ReadFromFile。如果那是您项目中唯一的 TU,那么在您实现 ReadFromFile 的确切位置不会有任何区别。

但是,如果您有另一个 TU,例如stuff.cpp 最终也引入了定义 ReadFromFile 的 header ,那么你会遇到一个问题:该函数最终出现在 main.obj 中和 stuff.obj,这让链接器提示,因为现在你最终违反了 One Definition Rule .

请注意,在每个单独的 TU 中,您的 include 守卫都按预期工作:编译器 在处理每个 TU 时都不会提示,无论您尝试引入同一个 header 多少次。

关于c++ - LNK2005 错误通过在 .cpp 而不是 header 中定义来解决。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28004368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com