在c語言中static有兩個作用,
- 一個是在函數中聲明變量,這樣就不會在函數的每次調用中都會重新初始化其值。
- 二是聲明全局的靜態變量或者函數。對於聲明的靜態變量或者函數,那么它就只能在本編譯單元可見,其他編譯單元中不可見。那么什么叫做一個編譯單元呢?一般來講,一個c源文件就是一個編譯單元,那么頭文件是怎么處理的呢?在預處理的時候,預處理器會把include的頭文件都展開到當前源文件中,然后由編譯器來編譯。這樣,我們就可以說,對於編譯器來講,它是見不到所謂的頭文件的,因為它在預處理階段就已經由預處理器給消滅掉了,即展開了。所以如果你在頭文件中定義了一個static變量,那么在每個include了它的源文件中都會有一個這樣的變量,而且他們相互之間不可見。所以,如果你想定一個全局變量,跨多個編譯單元可見的全局變量,那么你不能把它定義為static的。只能在一個源文件中定義為非static的,然后在頭文件中使用extern來聲明。然后在其他編譯單元中通過include這個頭文件來使用這個全局變量。同時,也不能通過在頭文件中定義一個非static變量的方式來實現,因為這樣頭文件會被展開到多個源文件中,從而造成在多個源文件中重復定義同一個變量的錯誤。另外,如果源文件的某些函數是你不希望外部使用的,就好比cpp的private函數一樣,那么你應該把它定義為static的。reference