繁体   English   中英

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

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

我知道...基本知识,但是我不明白。 我读到可以将函数定义放在标头中,然后将其包括在内。 到目前为止,我还没有做过这件事,因为我喜欢在.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但是它们对这些函数并不那么重要,因为它们只是将整数转换为QString并将在其他地方显示。 我也有一个包括后卫。

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

reviewToString(int)的多重定义

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

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

更好的是,不要将定义添加到标头中,只需声明即可。 将实现移至其自己的转换单元( .cpp -file)。 您不需要那里的inline ,它具有多重好处,随着项目的发展,它的重要性越来越重要。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM