2013-11-25 40 views
3

我有一個包含以下定義全球的std :: string和一個定義規則

const std::string error[] = {"a", "b"}; 

現在,我在兩個不同的翻譯單元此文件和編譯源代碼的一個頭文件。一切正常,但爲什麼?預計這將打破one definition rule

現在更有趣,我改變了類型

const char* error[] = {"a", "b"}; 

,在這裏它是,預期的錯誤

multiple definition of `error' 

它的工作原理相同的方法進行的std :: string爲intcharshort等整數類型。這是什麼?

回答

11

const命名空間範圍的變量內在聯繫,這就是爲什麼它的工作原理,實際上是相同的

static const std::string error[] = {"a", "b"}; 

第二個不工作,因爲它不是爲const的變量,但char它由...組成。

+1

不知道const給出了一個內部鏈接。謝謝。標準中提到了它嗎? – axe

+1

是的,找到了。 '聲明const的對象並沒有明確聲明爲extern有內部連接.' – axe

+0

@axe什麼是參考? – BoBTFish

2

聲明爲const的全局變量具有內部鏈接,就像它們也被聲明爲static一樣。您可以在不同的翻譯單元中定義具有相同名稱的內部變量,這就是您的第一個示例中發生的情況 - 包含標題的每個單元都會獲得其自己的數組副本。

第二個示例不是const - 指針指向常量對象,但它們本身是可變的。所以這個數組有外部鏈接,並且遵從一個定義規則。

0

MSDN

在C中,恆定值默認爲外部連接,因此它們可以在源文件中才會出現。在C++中,常量值默認爲內部鏈接,這允許它們出現在頭文件中。