2012-01-21 63 views
1

我正在努力讓FreeGLUT在OSX上構建,並且正在運行許多同樣問題的實例。許多功能僅存在於.c文件中。extern函數原型和靜態定義

下面是一個例子

extern void fghRestoreState(void); 

static void fghRestoreState(void){...} 

我對C有了解有限,但是編譯器錯誤似乎是有道理的:

src/Common/freeglut_gamemode.c:252: error: static declaration of ‘fghRestoreState’ follows non-static declaration 
src/Common/freeglut_gamemode.c:43: error: previous declaration of ‘fghRestoreState’ was here 

我的問題是,是否有他們設置它的任何理由這條路?它會在其他平臺上正確編譯嗎?

回答

6

關鍵字extern前面的功能意味着external linkage
它使您可以使用其他Translation units中定義的函數到您自己的源文件中。
簡而言之,它使您可以在另一個不包含聲明的文件中使用fghRestoreState()

而關鍵字static意味着一個Internal Linkage,即該函數只能在定義和聲明的文件中可見。
簡單地說,它告訴編譯器,我將只在這個源文件中使用這個函數,以便將其隱藏在我的項目中的所有其他文件中。

自上述錯誤以來,兩個關鍵字一起使用時出現衝突。
你不能告訴編譯器使所有文件都能看到這個函數(使用extern)&再次告訴它,把它從所有其他文件中隱藏(使用static)。

因此,請根據您對該功能的使用情況選擇關鍵字。

+0

這是我的理解,所以我不明白爲什麼圖書館會首先獲得該代碼。 有沒有任何條件,這將有道理? 據我所知,沒有ifdefs或任何會導致這種情況的原因。 – Kyle

+0

@凱爾:給出我的答案,你的編譯器驗證的,我想不出一個理由,爲什麼有人會這樣做。 –