多重定义 - 为什么我不能在标题中定义它们
Multiple Definition - Why can't I define them in a header
我知道...不知何故,但我不明白。我读到我可以将我的函数定义放在我的标题中并包含它。到目前为止,我从未这样做过,因为我喜欢我在与头文件中的声明分开的.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
文件中)。
相关文章:
- 只要我不包含一个标题,重新定义C++关键字合法吗
- 注意:'std::thread'在标题""中定义<thread>;您是否忘记了"#include<thread>"?
- C 在标题文件中创建具有结构定义的结构的队列
- 默认的车身或标题文件中的C 定义
- 向前删除标题文件中其他名称空间的自定义类型
- 我想在qt中创建自定义标题栏
- 无法包装标题文件中定义的简单类
- 将自定义按钮标题添加到消息框
- 在标题或实现文件中定义常数的优点
- 如何在源文件中定义类并将其声明在标题文件中(而不必使用`class :: method'语法定义类方法)
- 如何使用QT中的自定义标题栏移动窗口
- 如果我在标题文件中使用关键字的声明,则应该在定义本身中包含相同的关键字
- 使用自己的结构在标题类中定义功能
- C 使用c库,其中包含标题文件中定义的全局变量
- C 标题和类文件 - 未定义的参考
- C 定义了?宏?在标题中可见但在实施中缺少(Linker报告未解决的外部)
- 使用预编译标题时,重新定义_WIN32_WINNT
- gtkhow用自定义标题替换所有标题
- 尽管没有定义标题,但新的抛出bad_alloc <new> ?
- Windows 10上本机C++应用程序的自定义标题栏颜色