C++ 链接错误,它是如何发生的?

C++ 链接错误,它是如何发生的?,c++,struct,declaration,C++,Struct,Declaration,我有两个文件,utility.h和utility.cpp。我在.h文件中声明了一个struct BoundingSphere struct BoundingSphere { BoundingSphere(); D3DXVECTOR3 _center; float _radius; }; BoundingSphere::BoundingSphere() { _radius = 0; } 如果将BoundingSphere::BoundingSphere实现放入.h

我有两个文件,utility.h和utility.cpp。我在.h文件中声明了一个struct BoundingSphere

struct BoundingSphere
{
    BoundingSphere();
    D3DXVECTOR3 _center;
    float _radius;
};
BoundingSphere::BoundingSphere()
{
    _radius = 0;
}
如果将BoundingSphere::BoundingSphere实现放入.h文件中,则会得到一个链接错误,错误LNK2005:public:\uu thiscall BoundingSphere::BoundingSpherevoid已在bounding.obj中定义

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

之所以会发生这种情况,是因为您的第一个代码示例打破了规则

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


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

发生这种情况是因为您的第一个代码示例打破了规则

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


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

Als告诉了真相,但并不是全部真相,而是为了回答您的问题:如果您将实现放入.h文件中,那么您将它放入从包含头的每个源编译的对象文件中。因此,您有多个定义。如果将其放入.cpp文件中,那么它在该文件中只定义了一次。

Als说明了真相,但不是全部真相,而是为了回答您的问题:如果将实现放入.h文件中,那么它就位于从包含头的每个源编译的对象文件中。因此,您有多个定义。如果你把它放在.cpp文件中,那么它在该文件中只定义了一次。

你的意思是,如果.h文件不是内联函数,我就不能在其中实现函数?@cloud:不,你不能。另外,只有当函数的实现不重要时,才应该内联函数。你是说如果函数不是内联函数,我就不能在.h文件中实现它?@cloud:不,你不能。此外,只有当函数的实现不重要时,才应该内联函数。实际上,我添加了预编译命令ifndef uu d3dUtilityH uu define uu d3dUtilityH uuu,我想这会使.h文件只包含一次,不是吗?@Als,我写的时候你的答案要短得多。但我主要是指你使用的关键字格式化内联。类内的内联定义也会有类似的效果。@cloud,这意味着您不会在同一个单元中使用它两次。事实上,我添加了预编译命令ifndef\uuuuu d3dUtilityH\uuuu define\uuuuu d3dUtilityH\uuuu,我想这会使.h文件只包含一次,不是吗?@Als,我编写它时您的答案要短得多。但我主要是指你使用的关键字格式化内联。类内的内联定义也会有类似的效果。@cloud,这意味着在同一个单元中不会有两次它。