C++ 多重包含烦恼
C++ Multiple Include Annoyances
所以我正在编写一个已经足够大的程序,现在它有几个独立的源文件,因此有几个独立的头文件。我经常 运行 处理多个包含问题。
问题是我在 link 之前编译了所有单独的文件。因此,A.cpp 和 B.cpp 都包含 Z.h,因为 A.cpp 和 B.cpp 都使用函数声明和存在于 Z.h 内部的函数声明。在编译阶段这一切都很好,因为一切都井井有条,但是当我一起去 link A.o 和 B.o 时,编译器(linker)抛出多个定义错误,因为它在编译每个 .o 文件时包含了来自 Z.h 的函数定义,因此它们存在于两个 .o 文件中。这通常可以通过使用包含防护来避免,但在这种情况下,它们将不起作用,因为每个 .cpp 文件都是单独编译的,编译器 "forgets" 定义的预处理器变量的状态。
所以我的问题是,这在现实世界中是如何解决的?我已经进行了很好的挖掘,但已经干涸了,但我确信这之前一定已经解决了。
谢谢!
如果没有代码,很难准确地说出您 运行 遇到了什么问题,但您可能正在 header 中定义函数或变量。这不是 header 的用途,除非函数是 inline
或模板。包含 header 就像 copy/pasting 将其中的所有代码都放入您的 cpp 文件中。如果你在每个 cpp 文件中都有相同的变量,并且它不是静态的或在匿名命名空间中,那么当你尝试 link 时你将有多个定义并且 linker 会呕吐。
So, A.cpp and B.cpp both include Z.h, because both A.cpp and B.cpp use
function declarations and the such which exist inside of Z.h
这在技术上不可能是正确的,或者至少是一个不完整的描述。 Z.h
很可能不仅包含函数 declarations,而且还包含函数 definitions.
函数声明:
void f();
函数定义:
void f() { std::cout << "doing something\n"; }
So my question is, how is this solved in the real world?
您通过将声明保留在 Z.h
中并将定义移动到另一个待创建的 Z.cpp
文件中来解决这个问题。
所以我正在编写一个已经足够大的程序,现在它有几个独立的源文件,因此有几个独立的头文件。我经常 运行 处理多个包含问题。
问题是我在 link 之前编译了所有单独的文件。因此,A.cpp 和 B.cpp 都包含 Z.h,因为 A.cpp 和 B.cpp 都使用函数声明和存在于 Z.h 内部的函数声明。在编译阶段这一切都很好,因为一切都井井有条,但是当我一起去 link A.o 和 B.o 时,编译器(linker)抛出多个定义错误,因为它在编译每个 .o 文件时包含了来自 Z.h 的函数定义,因此它们存在于两个 .o 文件中。这通常可以通过使用包含防护来避免,但在这种情况下,它们将不起作用,因为每个 .cpp 文件都是单独编译的,编译器 "forgets" 定义的预处理器变量的状态。
所以我的问题是,这在现实世界中是如何解决的?我已经进行了很好的挖掘,但已经干涸了,但我确信这之前一定已经解决了。
谢谢!
如果没有代码,很难准确地说出您 运行 遇到了什么问题,但您可能正在 header 中定义函数或变量。这不是 header 的用途,除非函数是 inline
或模板。包含 header 就像 copy/pasting 将其中的所有代码都放入您的 cpp 文件中。如果你在每个 cpp 文件中都有相同的变量,并且它不是静态的或在匿名命名空间中,那么当你尝试 link 时你将有多个定义并且 linker 会呕吐。
So, A.cpp and B.cpp both include Z.h, because both A.cpp and B.cpp use function declarations and the such which exist inside of Z.h
这在技术上不可能是正确的,或者至少是一个不完整的描述。 Z.h
很可能不仅包含函数 declarations,而且还包含函数 definitions.
函数声明:
void f();
函数定义:
void f() { std::cout << "doing something\n"; }
So my question is, how is this solved in the real world?
您通过将声明保留在 Z.h
中并将定义移动到另一个待创建的 Z.cpp
文件中来解决这个问题。