c++ - 多重定义 - 为什么我不能在标题中定义它们

标签 c++ linker-errors header-files multiple-definition-error

我知道...有些基础,但我不明白。我读到我可以将我的函数定义放在我的标题中然后包含它。到目前为止,我从未这样做过,因为我喜欢在 .cpp 文件中将我的定义与它在头文件中的声明分开。

现在我只有两个函数,我不想为这些定义创建一个额外的文件。

标题.h

const QString reviewToString(const int); //Declaration - do I even need it now?
const QString statusToString(const int); //Declaration - do I even need it now?

const QString reviewToString(const int r) //Definition
{
    switch(r)
    {
    case 0:
        return "Excellent";
    case 1:
        return "Great";
    case 2:
        return "Okay";
    case 3:
        return "Poor";
    case 4:
        return "Terrible";
    default:
        return "Unknown";
    }
}

const QString statusToString(const int s) //Definition
{
    switch(s)
    {
    case 0:
        return "Watched";
    case 1:
        return "Bought";
    default:
        return "Not Watched";
    }
}

这是我的头文件的摘录。我得到了一些其他的 enumstruct 但它们对于这些函数来说并不那么重要,因为它们只是将整数转换为 QString 并将显示在其他地方。我也有一个包含守卫。

现在我遇到了很多这样的错误:

multiple definition of `reviewToString(int)'

这是为什么呢?为什么我不能在此 header 中声明和/或定义它们?

最佳答案

您需要在定义中添加inline。没有它,每个翻译单元都会创建自己的拷贝,链接器将不知道那些应该是重复的,并且他可以丢弃除了其中一个拷贝之外的所有拷贝。

更好的是,不要将定义添加到标题中,只需声明就足够了。将实现移动到它自己的翻译单元(.cpp-文件)。您在那里不需要 inline,它有多种好处,随着您的项目的发展,这些好处变得越来越重要。

关于c++ - 多重定义 - 为什么我不能在标题中定义它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18806197/

相关文章:

现有内存中的C++多维数组

c++ - 模板精神 X3 解析器

ios - 在 IOS 中集成 PayPal MPL 时出现链接错误

C++ 类(组合和继承 - 头文件、类数组)

c++ - 每个#include 指令预处理器的时间成本是多少?

c++ - 数据模型问题

c++ - 我无法使用 c++(代码块)中的 fstream 将文件内容复制到另一个文件内容。如何运行该文件?

ios - 使用Xcode 6时,AFNetworking与cocoapods链接错误

c++ - 符号查找错误 (linux - c++)

c++ - 为什么 `ccos` 、 `csqrt` 、 `cpow` 不被识别?