【发布时间】:2010-05-24 05:38:26
【问题描述】:
我在我的文件中添加了一些 const 字符,如下所示。我得到的错误是重复符号_xyz(比如说)。它有什么问题,我该如何摆脱它。
const char* xyz = "xyz";
class Abc
{
public:
Abc()
{
}
};
【问题讨论】:
标签: c++
我在我的文件中添加了一些 const 字符,如下所示。我得到的错误是重复符号_xyz(比如说)。它有什么问题,我该如何摆脱它。
const char* xyz = "xyz";
class Abc
{
public:
Abc()
{
}
};
【问题讨论】:
标签: c++
如果这是在头文件中,则每次#include 时都会定义xyz。
您可以按照@R Samuel Klatchko 的说明更改声明。通常的方式(如果数据不是const)是这样的:
在 Abc.h 中:
extern char *xyz;
在 Abc.cpp 中:
char *xyz = "xyz";
编辑添加
请注意,标头保护不会解决此问题:
#ifndef XYZ_H
#define XYZ_H
...
#endif
标头保护可防止“重新定义”错误,即同一符号在同一编译单元中出现两次。这是一个编译器错误。
但即使有标头保护,xyz 的定义仍会出现在包含它的每个源文件中,从而导致“重复符号”错误,即 链接器 错误。
当然,如果原始海报提到这一点会更有帮助。
【讨论】:
问题是每个包含头文件的源文件都有自己的 xyz 副本,并带有外部链接。
解决此问题的最简单方法是提供xyz 内部链接。除了具有底层 char 的 const 之外,您还可以通过使指针本身为 const 来做到这一点:
const char* const xyz = "xyz";
【讨论】:
我也遇到了这个问题,但对我来说解决方案不同。我在头文件中放置了重载的运算符(==、!=、
编辑:
这也可能是由以下原因引起的:
.cpp 文件而不是.h 文件。您可以通过将导入切换为使用 .h 而不是 .cpp 来解决此问题。.cpp 文件(以及其他解决方案)来解决此问题。【讨论】:
static 关键字。
我的用例:
a.hpp、b.hpp 和c.hpp,其中包含一些实用方法。util.hpp,它充当上述文件的聚合器。就我而言,extern 不起作用,但 static 起作用。
我不得不使用:
header guards 以避免 Visual Studio 代码中的错误。static 具有避免编译时错误的功能。也请查看article。
【讨论】:
请提供对问题的有意义的描述。什么是“我的档案”?你在谈论什么“const character”?
到目前为止,我只能猜测您将xyz 的上述定义添加到头文件中,然后将其包含到几个翻译单元中。结果:对象xyz 被多次定义。因此出现错误。
【讨论】: