2011-04-19 94 views
2

我有以下兩個文件:VS2010與extern關鍵字

  1. foo.h中
  2. bar.cpp

foo.h我decleare變量extern

現在,我想在bar.cpp(包括foo.h之後)使用相同的變量。

在VS2008和VS2010下,我得到unresolved external symbol錯誤,而在Ubuntu下使用gcc編譯成功。

(即,我試圖編譯以下源代碼:http://www.fromdual.com/using-mysql-user-defined-functions-udf; foo.h是指srv0srv.h,bar.cpp是指源代碼。所有包含都已到位,編譯成功,鏈接下降)

問題可能是什麼?

回答

0

問題是,前面提到的符號必須從dll中導出(通過dllspec)才能從外部看到。只有extern關鍵字不允許從外部看到它。

3

extern關鍵字向編譯器指示它後面的變量已經在其他地方聲明過了。它實際上並沒有爲變量分配空間。如果你想通過包含一個頭文件來創建一個可以使用的全局變量(順便說一句,這通常是一個壞主意),你可以通過以下方式來完成。

foo.h中:

extern int myVar; 

在Foo.cpp中:

int myVar; 

myVar的現在位於Foo.cpp中,但foo.h中extern語句,允許在其他文件中的代碼(如bar.cpp)通過包含foo.h來訪問它。

0

當您使用extern來聲明變量(其他源對象或文件中的全局變量)時,您實際上告訴編譯器在其他地方查找變量的定義。在這種情況下,您需要提供另一個定義爲int myVar的源文件。

0

您的變量必須在其中一個源文件的某處引用。通過extern關鍵字,你只能告訴「有一個變量」,但鏈接器必須知道它的位置。在編譯源代碼時,它會爲變量創建引用等。鏈接程序將根據這些引用鏈接。如果你實際上沒有創建一個引用變量鏈接器將無法找到引用,所以它會給出錯誤。如果您使用extern,則表示不要在此處創建對此變量或任何其他事物的引用。但是在其他地方必須提到它。

+0

謝謝!我不明白,爲什麼代碼能夠編譯,但是在VS2010中沒有鏈接,爲什麼它能在linux下使用gcc? – krisy 2011-04-20 06:57:18