2014-02-27 79 views
0
static void foo(void); 

[.....] 

void foo(void) { 
    ..... 
} 

產生靜態範圍的「foo」,而如果將「static」從聲明移至定義,則會出現錯誤。我不能制定一個谷歌疑問,讓我一個理由,但似乎並不理性的我....過程聲明和定義不匹配

沒有人有見解?

+0

'lint'也警告在這裏。在兩個聲明中都加入'static'。 – ouah

+0

這樣做最有意義。問題在於爲了讓它與衆不同而尋找理由。我偶然發現了一個「靜態」通常只應用於聲明而不是定義的環境。這個問題的出現是因爲我驚訝地發現它是合法的並且使程序具有靜態範圍。 –

回答

0

連接器需要的函數聲明來解決,通過翻譯單元調用。所以,如果函數被聲明爲靜態的,它將不能在翻譯單元之外訪問。

如果您聲明functio爲非靜態,並將其定義爲靜態,則會出現錯誤,因爲聲明&定義不匹配,但名稱相同。

0

想象典型情況下函數的聲明可能是一個頭。如果你聲明函數不是靜態的,你告訴編譯器「這個函數在這個翻譯單元之外是可用的」。然後該函數被定義爲「僅在該翻譯單元中可見」,這當然是不可行的。

周圍的其他方式(你寫的方式),你的聲明說:「這個功能不可用本機之外」,並定義爲「順便說一句,這裏是功能」。定義中並沒有提到靜態的事實並不重要。

誠然,這會更有意義,迫使「靜態性」是聲明和定義之間是相同的,但我認爲它仍然有效的方式是。