1

我有一个大项目(400 个文件),所有标题都包含警卫和所有内容,但是我收到 500 LNK2005 错误。

可能是我在某些标头中定义了函数体吗?因为我在 DirectX 实用程序标头中看到了相同的内容(DirectXCollision 的某些功能完全在标头中)。

或者可能是因为他们使用的是 .inl 文件而不是 .cpp?

4

3 回答 3

3

可能是我在某些标头中定义了函数体吗?

是的,可能是这样。在多个翻译单元中定义函数会导致重复符号定义错误。

您可以通过声明这些函数来绕过重复错误inline[7.1.2]/2内容如下:

带有 inline 说明符的函数声明(8.3.5、9.3、11.3)声明了一个内联函数。inline 说明符向实现表明,在调用点对函数体进行内联替换优于通常的函数调用机制。在调用点执行此内联替换不需要实现;然而,即使省略了这个内联替换,7.1.2 中定义的内联函数的其他规则仍应得到遵守。

于 2013-01-11T00:16:24.663 回答
2

包含守卫只会使您免于将相同的标头多次包含到同一个编译单元(一个 cpp 文件)中。如果您将标头包含在第二个 cpp 文件中,然后将它们链接在一起,它们都会包含标头带来的任何内容。这就是为什么在标头中包含函数实现通常是个坏主意。

您可以通过声明内联函数来解决此问题,然后编译器将复制/粘贴它们。

于 2013-01-11T00:16:48.313 回答
0

您是否在头文件中定义全局变量?这可能是错误的原因。包括警卫也无济于事。

全局变量应仅在一个翻译单元中定义,并应在所有其他翻译单元中外部。

例如。在 xh 中,你有

int myVar;

现在你在 a.cpp 和 b.cpp 中都 #include xh,那么即使你在 xh 中包含保护,你也会得到一个链接器错误

因为现在 myVar 将在 a.obj 和 b.obj 中定义,链接器将找到 2 个 myVar。

于 2013-01-11T17:35:59.333 回答