2010-05-24 63 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