1. 使用在全域變數或全域函式 (Global variable & Global function)
讓該變數(或該函式)的可視範圍只侷限在該檔案內,其他的 .c檔看不到此變數(或函式)的存在。
既使其他檔案用extern宣告也看不到!套句行話來說,他把Global的變數或函數變成了「internal linkage」,當Linker在找symbol時是會忽略它的。
(在C++中也相容這種用法,不過被視為比較不建議的舊的用法,C++比較建議使用unnamed namespace。)
使用時機:當此全域變數(或全域函式)不想被其他檔案引用和修改時,或者不同檔案可以使用相同名字的全域變數(或全域函式)而不會產生命名衝突。
2. 使用在函式內的區域變數 (Local variable)
因為區域變數預設就是動態變數,而在區域變數前加上static修飾字則會將變數由動態(dynamic)變數轉為靜態(static)變數,靜態變數的壽命(lifetime)與動態變數不同,靜態變數會一直存在,直到程式結束為止。
使用時機:這種很適合用來做統計次數的功能(某函式被呼叫幾次),例如以下的代碼...
void count();
int main()
{
int i;
for (i = 1; i <= 10; i++)
count();
return 0;
}
void count()
{
static cnt = 0;
cnt++;
printf(" It have been called %d",cnt,"times\n");
}
其執行結果就會是:
It have been called 1 times.
It have been called 2 times.
It have been called 3 times.
做個總結,static的用法整理如下表:
修飾對象 使用在... Linkage Scope
---------------------------------
變數 函式裡 internal Block
變數 函式外 internal File
變數 成員 external Class (for C++)
函式 global internal File
函式 成員 external Class (for C++)
static感覺是很簡單的東西,解釋起來卻這麼複雜,也難怪我花了這麼久的時間才把他搞懂了...如果高手看到這篇還有我觀念錯誤的地方,還請不吝指教阿 ^^|||
PS:又有同學舉一反三的問我:那C語言中的static和const還有volatile在用法上各有什麼差異?這問題實在是問的太好了,請這位童鞋自己去找答案後再告訴我吧!C我也不熟阿!
秋哥,這篇真是惠我良多啊XD。我後來去找了幾篇文章整理了一下,基本上就跟你整理的表一樣,不過我發現有人提到一個滿好記的說法,整理如下,你參考參考...
回覆刪除C語言static有兩個目的
1.static storage (靜態存儲):變數儲存空間為static storage而非function stack,使變數生命週期與程式相同。
2.internal linkage(內部連結):限制變數可視範圍於檔案內。(聽說這是後來加的,為了減少保留字的使用所以也用static)
當你使用static修飾字...
已經有內部連結特性的(區域變數)就加上靜態存儲特性。
已經有靜態存儲特性的(全域變數和函式)就加上內部連結特性。
C++則多了一種修飾對象 "成員"
然而用static將成員修飾為類別成員仍然無法獲得內部連結特性,所以需要配合private跟protected額外的做存取範圍的限制。
哈哈,感謝你的補完啦...(還匿名咧...會叫我秋哥的也沒幾個XD)
回覆刪除感謝您的資料整理!謝謝。
回覆刪除static 後面是不是要加int?
回覆刪除我的dev c++要加個int 才跑得動ˊˇˋ
解釋的好清楚,感謝大大分享
回覆刪除