2016-12-23 19 views
2

在file1.cc我寫不同的文件有不同的範圍嗎?

int i = 0; 

而在file2.cc我寫

#include <iostream> 

int i = 1; 

int main() 
{ 
    std::cout<< i << std::endl; 
    return 0; 
} 

在MacOS的編譯器報告

duplicate symbol _i in: 
/var/folders/wn/q9648wb507j9l504vp2d_dwm0000gn/T/file1-bb8eca.o 
/var/folders/wn/q9648wb507j9l504vp2d_dwm0000gn/T/file2-b5e667.o 
ld: 1 duplicate symbol for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

不過是不是不同的文件有他們的不同範圍,以便我們可以在file2中定義一個全局變量,其名稱與file1中的名稱相同? 此外,如果不同的文件在同一範圍內,那麼爲什麼是非法的,因爲變換file2.cc:

#include <iostream> 

int main() 
{ 
    std::cout<< i <<std::endl; 
    return 0; 
} 
+5

如果你希望你的全局變量有內部鏈接(即只內,只在定義文件中可見) - 它們標記爲'static',或者把它們放在匿名'namespace'。 –

+0

你應該在file2.cc中有「extern i」 – Aram

+0

全局變量是** global ** - 它隨處可用。 –

回答

6

相同的全局變量的多個定義是不允許的。您必須標記變量staticconst,或將它們放置在匿名名稱空間中。否則他們在全球範圍內。

而且你的第二個問題:示例代碼無法編譯,因爲編譯器不看到來自其他文件中的全局變量,因爲編譯器在編譯時一個轉換單元(C++文件)。這就是爲什麼你需要添加extern i;。這告訴編譯器,該變量將在另一個翻譯單元中定義。

後的所有文件已成功編譯,它們將被鏈接。鏈接器檢查所有翻譯單元。當您得到關於多個定義的錯誤時,在鏈接期間發生此錯誤。

+1

未命名的名稱空間規則僅在C++ 11中有效,對嗎? http://stackoverflow.com/questions/13396748/are-objects-in-anonymous-namespace-implicitly-static – gurka

+0

謝謝!您的回答完全消除了我的困惑:) – Felix

1

全球範圍內爲同一可執行鏈接文件是一樣的。爲了避免這種情況,你可以聲明它爲static,但在C++中不贊成。
分離兩個文件範圍的正確方法是使用namespaces

1

您的變量在相同的範圍內。您必須使用名稱空間來聲明具有相同名稱的變量。

+0

新增示例幫助更好地闡明瞭答案 – GurV