2010-05-24 56 views
23

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

const char* xyz = "xyz"; 
class Abc 
{ 
public: 
    Abc() 
    { 
    } 
}; 

回答

37

如果这是一个头文件,你在你每次#include它定义xyz

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

在Abc.h:

extern char *xyz; 

在Abc.cpp:

char *xyz = "xyz"; 

编辑补充

请注意,标头警卫将不是解决此问题:

#ifndef XYZ_H 
#define XYZ_H 
... 
#endif 

标题保护可防止“重新定义”错误,其中相同的符号在同一个编译单元中出现两次。这是一个编译器错误。

不过,即使头守卫的xyz定义仍然会出现在包括它的每一个源文件,造成“重复的符号”错误,这是一个连接错误。

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

+0

声明一个变量多次是不是一个错误(如果它是不一样的翻译单元内)。定义它是。 – 2013-12-09 06:21:21

+0

我应该抓住这一点,谢谢。 – egrunin 2013-12-09 17:39:33

+1

感谢球队后卫的澄清。这是一件很奇怪的事情 - 如果我在头文件中定义了一个函数,我只会得到重复符号的链接器错误。在我目前的情况下,我有一堆常量和一些头函数中定义的函数 - 我只为函数获取链接器错误,const的确定。这是为什么? – 2017-05-04 12:23:28

-9

请提供一个有意义的问题描述。什么是“我的文件”?你正在考虑什么“常量字符”?

对于您所提供的内容,我只能猜测您将xyz的上述定义添加到头文件中,然后将其包含到多个翻译单元中。结果:对象xyz被定义了多次。因此错误。

7

问题是包含头文件的每个源文件都会通过外部链接获取它自己的xyz副本。

解决这个问题的最简单方法是给xyz内部链接。你可以做到这一点使得指针本身是常量,除了具有基本字符的常量:

const char* const xyz = "xyz"; 
+0

+1这是最好的解决方案。 'const'总是很好。 – 2010-05-24 07:06:08

+3

const绝对是好的,但这只是隐藏了现在每个文件都有相同数据的实例的问题。 – 2010-05-24 14:54:48