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

Multiple Definition - Why can't I define them in a header

本文关键字:定义 标题 为什么 不能      更新时间:2023-10-16

我知道...不知何故,但我不明白。我读到我可以将我的函数定义放在我的标题中并包含它。到目前为止,我从未这样做过,因为我喜欢我在与头文件中的声明分开的.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";
    }
}

这是我的头文件的摘录。我得到了一些其他enum s和struct s,但它们对于这些功能并不那么重要,因为它们只是将整数转换为QString,该QString将显示在其他地方。我还有一个包括警卫。

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

"reviewToString(int)"的多重定义

为什么?为什么我不能在此标头中声明和/或定义它们?

您需要

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

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

这里的问题是"一个定义规则"。(C++标准§3.2

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