链接阶段的多重定义错误
Posted
技术标签:
【中文标题】链接阶段的多重定义错误【英文标题】:Multiple definition error at the linking stage 【发布时间】:2020-02-09 14:53:11 【问题描述】:如果我的项目由两个翻译单元a.cpp和b.cpp组成,并且有h.cpp有一个功能定义。在这种情况下,每个 .cpp 文件都会被成功编译,但在链接阶段我们会得到多个定义。为避免这种情况(如果您不将定义放在单独的 .cpp 文件中),您可以制作此函数
-
内联
静态
静态内联
用空的命名空间包围它
谁能解释这四种方法的区别,哪个更好用。而如果是模板函数会怎样,会不会有什么问题?
【问题讨论】:
当您包含包含函数定义的头文件时,您考虑的所有选项在特殊情况下都很有用。通常你只在标题中保留声明,并将它们包含在 cpp 文件中,并将定义保留在 cpp 文件之一或单独的 cpp 文件中。 【参考方案1】:这些是对您的前 3 个声明的有用解释:
-
inline
static
static inline
第四个选项是在某些情况下需要研究的特殊情况。
如果是模板,您必须记住所有函数都必须在同一个文件中定义,通常是.h
或.hpp
。如果您想将定义与实现分开,请记住在定义函数的文件末尾包含.cpp
或实现函数的文件。
【讨论】:
以上是关于链接阶段的多重定义错误的主要内容,如果未能解决你的问题,请参考以下文章
链接器多重定义错误:为啥 <thread> 似乎定义了我的函数?