2012-04-26 47 views
2

錯誤C2129:靜態函數 'void FUNC(INT,CHAR *)' 已宣告但尚未定義編制問題 - 代碼C2129

我讀到:

靜態函數必須的文件範圍內定義。如果該函數是在另一個文件中定義的,則必須聲明爲extern。

文件範圍意味着它必須在 C++或.h中定義,或者只是在其聲明的.h文件中定義。

回答

6

C++編譯器沒有看到.h文件,文件的內容將被預處理器本身放置到cpp文件中。這裏的文件範圍應該是該函數應該在cpp文件中。

+0

好吧。乾杯。我遇到的問題是在名爲util.h的文件中存在一個聲明爲靜態的函數。如果我右鍵單擊並轉到定義,它會將我帶入.cpp中的定義。但是當我編譯我得到上面的錯誤。這兩個文件都在相同的位置,我在「附加包含目錄」屬性中添加了該文件。你有任何想法,爲什麼這可能會發生? – discodowney 2012-04-26 12:47:10

+0

當出現錯誤時,您應該注意文件實際編譯的內容。當你編譯Util.cpp並且函數在Util.cpp中定義時,你不會得到那個錯誤。 – harper 2012-04-26 12:51:22

+0

您需要從util.h中移除靜態函數 - 靜態函數應該只在.cpp文件中,並且只能用於.cpp文件 - 如果您需要它在兩個.cpp文件中,那麼它需要extern – Mark 2012-04-26 12:51:36

2

如果函數是在另一個文件中定義的,則必須聲明爲 extern。

在此聲明中,「另一個文件」轉換爲「另一個目標文件」,它在編譯後最終會鏈接在一起。就像Naveen回答的那樣,編譯器並不在乎函數在哪個源文件中聲明。