我有一个大项目(400个文件),所有标题都包含警卫和一切,但是我得到500个LNK2005错误。
可能是我在某些标题中定义了函数体吗?因为我在DirectX实用程序头中看到了相同的东西(DirectXCollision的一些功能完全在标题中)。
或者可能是因为他们使用.inl文件而不是.cpp?
答案 0 :(得分:3)
可能是我在某些标题中定义了函数体吗?
是的,那可能是。在多个转换单元中定义函数会导致重复的符号定义错误。
您可以通过声明这些函数inline
来解决重复错误。 [7.1.2] / 2 读取:
带有内联说明符的函数声明(8.3.5,9.3,11.3)声明了内联函数。内联说明符向实现指示在调用点处函数体的内联替换优先于通常的函数调用机制。在呼叫点执行此内联替换不需要实现;但是,即使省略了这种内联替换,仍应遵守7.1.2定义的内联函数的其他规则。
答案 1 :(得分:1)
包含防护只会使您不会多次将相同的标题包含在同一个编译单元(一个cpp文件)中。如果你将标题包含在第二个cpp文件中,然后将它们链接在一起,它们都将包含标题所带来的任何内容。这就是为什么在标题中包含函数实现通常是一个坏主意。
您可以通过声明函数内联来解决这个问题,然后编译器会复制/粘贴它们。
答案 2 :(得分:0)
您是否在头文件中定义了全局变量?这可能是错误的原因。 而且包括警卫也无济于事。
全局变量只应在一个翻译单元中定义,并且应在所有其他翻译单元中被删除。
例如。 在x.h中,你有
int myVar;
现在你在a.cpp和amp;中#include x.h b.cpp, 那么即使你在x.h中包含了guards,你也会得到一个链接器错误
因为现在myVar将在a.obj和b.obj中定义,链接器将找到2个myVars。