1

我有两个文件,utility.hutility.cpp. BoundingSphere我在 .h 文件中声明了一个结构

struct BoundingSphere
{
    BoundingSphere();
    D3DXVECTOR3 _center;
    float _radius;
};
BoundingSphere::BoundingSphere()
{
    _radius = 0;
}

如果我将BoundingSphere::BoundingSphere()实现放入 .h 文件中,我会收到链接错误,错误 LNK2005:“public: __thiscall BoundingSphere::BoundingSphere(void)”已经在 bounding.obj 中定义

但是,如果我将实现放入 .cpp 文件中,它可以正常工作。我的问题是它怎么会发生?

4

2 回答 2

3

发生这种情况是因为您的第一个代码示例违反了One Definition Rule

当您在头文件中包含定义时,预编译器仅将头文件的内容复制粘贴到您包含头文件的每个翻译单元中。
你最终得到的是同一个函数的多个定义,这打破了一个定义规则,因此导致链接器错误。

如果需要在头文件中添加定义,则需要将函数标记为inline. 尽管您应该注意,对inline函数的请求只是对编译器的建议,可以自由接受或拒绝它。

于 2012-04-10T08:44:13.910 回答
2

Als 说实话(虽然不是全部真相),但要回答您的问题:如果您将实现放入.h文件中,那么您将它放在从包含标头的每个源编译的目标文件中。因此,您有多个定义。如果将其放入.cpp文件中,则它在该文件中仅定义一次。

于 2012-04-10T08:46:32.510 回答