2012-10-06 60 views
2

this問題,我問爲什麼爲什麼我們需要extern?

//foo.h 
namespace foo{ 
    int bar; 
} 

給了我一個鏈接錯誤,當我包括foo.h在多個文件中。原來我需要extern int bar;來防止錯誤。爲什麼我需要extern?我不想在每個想要在多個翻譯單元中訪問的每個名稱空間中的每個變量之前鍵入extern。爲什麼int bar;做我所期望的呢?爲什麼C++標準委員會堅持讓我在任何地方輸入extern

+3

*聲明*和*定義*之間的差異。 – WhozCraig

回答

10

Extern說變量的存儲聲明將在其他地方進行。鏈接器會在鏈接時去找另一個文件中的符號。如果沒有外部函數,你告訴編譯器,爲全局分配一些空間。如果您在多個文件中執行此操作,鏈接器將會看到同一個符號的多個實例。

+0

我明白了,基本上這裏沒有捷徑。我真的必須在每個變量前輸入'extern'嗎? – anthropomorphic

+0

這甚至比這更棘手。你需要在頭文件中的每個變量前面都有一個extern,但是你需要在你的代碼文件中有一個沒有extern的相應定義。 – CrazyCasta

+0

我會繼續說下去。如果通過在聲明中正確地進行外部處理來管理全局變量會成爲屁股的一大痛點,那麼機會是「extern」不是你的問題;全球各地的灑貨商品都是*。 – WhozCraig

3

爲什麼C++標準委員會堅持讓我在任何地方都輸入extern ?

它從來沒有告訴過寫到處....

namespace foo{ 
extern "C++" { 
    int bar; 
    int car; 
    int dar; 
    int xar; 
} 

} 
+1

大聲笑,非常真實,+1 ... – 2012-10-06 20:50:52

+0

這就像在每個人之前寫入extern一樣嗎? – anthropomorphic

+0

@MichaelDorst: - 當然......直到你的編譯器明白 – perilbrain