只是另一个“此处首先定义的多重定义”错误
Posted
技术标签:
【中文标题】只是另一个“此处首先定义的多重定义”错误【英文标题】:Just another "multiple definition first defined here" error 【发布时间】:2014-01-22 12:42:29 【问题描述】:好的,所以我在过去的 4 个小时里一直在搜索每个论坛关于“这里首先定义的多重定义”的问题,我想我一定是真的很愚蠢,但我似乎无法解决这个问题。
我有以下文件:
main.cpp
Socket.h
Socket.cpp
Server.h
Server.cpp
Packet.h
FileHandlerIn.h
FileHandlerOut.cpp
main.cpp 只包含 Server.h,它声明了一些函数,然后在 Server.cpp 中定义。 Server.cpp 使用了 Socket.cpp、FileHandlerOut.cpp 和 Packet.h 中的函数,因此 Server.h 中包含了头文件 Socket.h、Packet.h 和 FileHandlerIn.h。除标准库外,其他头文件均不包含任何其他内容。
发生的情况是 Server.cpp 中的每个函数和 Packet.h 中的每个函数都会出现多重定义错误。我在 Packet.h 中有函数的原因是我定义了一个结构,并且 Packet.h 函数都在该结构上运行。我真的很困惑我应该如何正确定义这些函数,所以我可以在其他 cpp 文件中使用它们,这可能是我的问题的一部分?
【问题讨论】:
你的标题中是否包含保护? 如果你有函数,定义在头文件中,不是结构/类的成员函数,你需要inline
。
将您的代码缩减为一个完整且仍能重现问题的最小示例,然后在此处发布。
【参考方案1】:
Packet.h
中的每个函数都会出现多重定义错误
如果您要在标头中定义函数(在类定义之外),则需要将它们标记为inline
。这放宽了单一定义规则,允许在多个翻译单元中进行定义。
每个翻译单元中仍然只允许一个定义,因此请确保标题具有包含保护。
【讨论】:
非常感谢,这解决了Packet函数的多重定义问题。 Server.cpp 中发生的其他多重定义错误是因为静态成员是在头文件中定义的,当我将它们移动到 cpp 文件时错误消失了。以上是关于只是另一个“此处首先定义的多重定义”错误的主要内容,如果未能解决你的问题,请参考以下文章