標準似乎暗示有上的變量的定義的數量沒有限制,如果它不是ODR使用的(§3.2/ 3):如果我不使用變量,我可以在翻譯單元中有多個定義嗎?
每個程序應包含正好一個定義每個非內聯函數或在該程序中使用的變量;不需要診斷。
它說,任何變量不能一個翻譯單元(§3.2/ 1)內定義多次:
未翻譯單元應包含任何變量的多個定義,功能,類類型,枚舉類型或模板。
但我無法在整個程序中找到對非odr使用變量的限制。那麼,爲什麼我不能編譯類似如下:
// other.cpp
int x;
// main.cpp
int x;
int main() {}
編譯和鏈接這些文件與G ++ 4.6.3,我得到一個鏈接錯誤multiple definition of 'x'
。說實話,我期望這一點,但由於x
沒有任何地方使用臭氧(據我所知),我看不出標準如何限制這一點。或者它是不確定的行爲?
你如何得出結論,這兩個名字'x'不表示相同的變量? – ecatmur
@ecatmur:有兩個變量,因爲有兩個定義:'int x;'定義一個具有靜態存儲持續時間的變量。有兩個這樣的定義,因此有兩個變量。如果程序按照Luc Danton的建議進行了修改,那麼只會有一個變量,因爲只有一個定義('extern int x;'不是'_的_definition_';它只是一個_declaration_)。 –
如果不是'int x;'聲明的形式是'class y {};'或'namespace z {}'(兩個定義),那麼名稱'y'和'z'將分別表示相同的類型或名稱空間。變量'x'有什麼不同? – ecatmur