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

时间:2013-09-14 20:39:08

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

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

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

Header.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 s但它们对于这些函数并不重要,因为它们只是将一个整数转换为QString,它将显示在其他地方。我也有一名包括警卫。

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

  

`reviewToString(int)'的多重定义

为什么?为什么我不能在这个标题中声明和/或定义它们?

2 个答案:

答案 0 :(得分:4)

您需要在定义中添加inline。没有它,每个翻译单元将创建自己的副本,链接器将不知道那些应该是重复的,并且他被允许扔掉除了其中一个副本之外的所有副本。

更好的是,不要在标题中添加定义,只需声明即可。将实现移动到自己的翻译单元(.cpp - 文件)。您不需要inline,并且随着项目的增长,它会带来越来越重要的好处。

答案 1 :(得分:2)

这里的问题是One Definition Rule。 (C ++标准§3.2

基本上,您不能在整个程序中为函数定义多个定义。但是,您可以创建函数inline(否则,您必须将它们放在.cpp文件中)。