2013-04-05 73 views
15

我很難理解'extern'是如何工作的。 我已經搜索谷歌,但似乎並沒有特定的例子,我想在C++中使用extern

如果我有一個文件main.cpp其中引用one.h ,並在它我有一個名單LIST1(這是一個雙100×100數組) 所以我有雙List1 [100] [100];

如何在one.cpp中使用此列表?

extern double LIST1[100][100] 

不工作:/

main.cpp中:

#include "one.h" 

extern double LIST1[100][100]; 

one.cpp:

void one::useList() 
{ 
for(j = 0; j < 100; j++) 
    { 
    for(i = 0; i < 100; i++) 
    { 
     LIST1[j,i] = 0.5; 
    } 
} 
} 

這就是我。

錯誤我發現了:

1> main.obj:錯誤LNK2001:解析外部符號 「雙(* LIST1)[100]」(LIST1 @@ @ 3PAY0GE NA?)

+1

你能否清楚地說明你在哪個文件中有哪些代碼。你目前的描述相當混亂。 – NPE 2013-04-05 19:02:25

+1

並定義「不工作」 – infiniteRefactor 2013-04-05 19:04:34

+0

'LIST1 [j,i] = 0.5;'也應該給出一個錯誤 - 你的意思是'LIST1 [j] [i] = 0.5;' – 2015-03-26 19:42:20

回答

21

在C++中,與之前的C一樣,每個源文件都被編譯爲一個對象文件。然後鏈接所有的目標文件來創建可執行程序。

要共享符號(函數,全局變量),有幾個關鍵字告訴編譯器哪些文件是本地的,哪些是私有的,哪些是從其他文件導入的。

'extern'關鍵字表示符號可以被訪問,但沒有被定義。它應該在其他模塊中定義(作爲全局)。如果沒有,鏈接時會出現「未定義符號」錯誤。

29

命名空間範圍內的變量聲明始終是定義,除非您將extern放在上面;那麼這只是一個聲明。

C++中的一個重要規則是不能有多個具有相同名稱的對象的定義。如果您的頭文件只包含double LIST1[100][100];,只要您只將它包含在一個翻譯單元中,就可以工作。但是,只要將頭文件包含在多個翻譯單元中,就有多個定義LIST1。你違反了規則!

因此,要從多個翻譯單元訪問全局變量,您需要確保頭文件中只有一個聲明。我們這樣做是與extern

extern double LIST1[100][100]; 

但是,你不能只包括頭和嘗試,因爲沒有一個定義尚未使用這個對象。這個LIST1聲明只是說這個類型的數組存在某個地方,但我們實際上需要定義它來創建該對象。因此,在一個單一的翻譯單元(通常是您.cpp文件之一),你將需要把:

double LIST1[100][100]; 

現在,每個.cpp文件可以包含頭文件,並永遠只拿到申報。在你的程序中有多個聲明是很好的。只有其中一個.cpp文件將具有此定義。