gpt4 book ai didi

c++ - 为什么包含 .h 也会使 .cpp 源代码随之而来?

转载 作者:太空狗 更新时间:2023-10-29 23:49:46 25 4
gpt4 key购买 nike

我是一名经验丰富的程序员,但仅限于高级语言;我现在正在用 C++ 做我的第一个非常大的项目。

我有两个类,ClassAClassBClassA 是(除其他事项外)ClassB 的索引,因此 ClassA 需要知道什么是 ClassB从中构建数组,ClassB 需要知道 ClassA 是什么,以便它可以在发生变化时更新索引。这两个类都在它们自己的 .h 和 .cpp 文件中。

我认为相互包含只会导致无限递归,所以我决定改为使用 #include "ClassA.cpp"#include "ClassB.cpp"main.cpp 的开头;但是这样做只会导致编译器警告这些文件中每个类和方法的多个定义。

经过一些实验,我发现包含 ClassA.hClassB.h 会产生所需的行为 - 但这没有任何意义,我只是包括那些类的原型(prototype)。实际构成它们的代码肯定不会混入吗?然而它确实如此。

这里发生了什么我不明白的事情?为什么包含 ClassA.h 也会使 ClassA 的实际代码与其一起显示?为什么包含 ClassA.cpp 会导致 ClassA.h 的每个包含都触发“多重定义”错误,即使它们位于 header 屏蔽或任何它所谓的?

最佳答案

缺少的步骤是链接器看不到 ClassA.cppClassB.cpp 中的定义,除非这些文件也是 在某个时候编译。如果你做了这样的事情:

g++ main.cpp ClassA.cpp ClassB.cpp

那么 main.cpp 中对 ClassA.cppClassB.cpp 中定义的所有引用都将被解析。然而,如果你只是做了

g++ main.cpp

那么链接器将不知道在哪里可以找到 ClassA.cppClassB.cpp 中的定义,您可能会遇到错误。

如果您使用的是 IDE,这个细节对您是隐藏的:IDE 确保只要您将 .cpp 文件添加到您的“项目”,它就会在您构建项目时被编译成最终的二进制文件.

关于c++ - 为什么包含 .h 也会使 .cpp 源代码随之而来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37061651/

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