重复的符号错误C++

boo*_*oom 32 c++

我在我的文件中添加了一些const字符.我得到的错误是重复符号_xyz(说).它有什么问题,我怎么能摆脱这个问题.

const char* xyz = "xyz";
class Abc
{
public:
    Abc()
    {
    }
};
Run Code Online (Sandbox Code Playgroud)

egr*_*nin 47

如果这是在头文件中,那么xyz每次都是这样定义的#include.

您可以更改@R Samuel Klatchko所显示的声明.通常的方式(如果数据不是const)是这样的:

在Abc.h中:

extern char *xyz;
Run Code Online (Sandbox Code Playgroud)

在Abc.cpp中:

char *xyz = "xyz";
Run Code Online (Sandbox Code Playgroud)

编辑添加

请注意,标题保护不会解决此问题:

#ifndef XYZ_H
#define XYZ_H
...
#endif
Run Code Online (Sandbox Code Playgroud)

标题保护会阻止"重定义"错误,其中相同的符号在同一编译单元中出现两次.这是一个编译器错误.

但即使使用标题保护,xyz仍然会在包含它的每个源文件中出现定义,从而导致"重复符号"错误,这是链接器错误.

如果原始海报当然提到过那会更有帮助.

  • 感谢头部保护澄清.这是一个奇怪的事情 - 如果我在该头中定义了一个函数,我只会得到重复符号的链接器错误.在我目前的情况下,我有一堆常量和一些在头文件中的命名空间中定义的函数 - 我只得到函数的链接器错误,const是可以的.这是为什么? (2认同)

Eri*_*ner 10

我也遇到了这个问题,但对我来说解决方案是不同的。我在头文件中放置了重载运算符(==、!=、<<)并实现了它们。这在我也使用 ==、!= 或 << 的其他文件中引起了问题。为了解决这个问题,我将实现移到 .cpp 文件中,并将声明留在头文件中。

编辑

如果出现以下情况,也可能会导致这种情况:

  • 您正在包含.cpp文件而不是.h文件。您可以通过将导入切换为使用.h而不是.cpp.
  • 您正在头文件中(在类声明之外)实现静态函数。您可以通过将实现移动到.cpp文件中来解决此问题(以及其他解决方案)。

  • 或者,如果您有一个仅包含头文件的库,则可以在运算符前面添加“static”关键字。 (3认同)

R S*_*hko 9

问题是包含头文件的每个源文件都有自己的xyz外部链接副本.

解决这个问题的最简单方法是提供xyz内部联系.除了具有底层char的const之外,你可以通过使指针本身为const来做到这一点:

const char* const xyz = "xyz";
Run Code Online (Sandbox Code Playgroud)

  • const绝对是好的,但这只是隐藏了现在每个文件都有相同数据实例的问题. (3认同)