2013年1月21日 星期一

有關C語言的static用法


http://archerworks.blogspot.tw/2010/07/cstatic.html


有關C語言的static用法


由於工作的關係使用的是C語言,而static的關鍵字我卻常以JAVA的角度來理解而造成誤解,經過trace大量的code和翻查一些書後,我總算搞懂static在C語言中的用法了。原來他是依修飾的對象不同而有不同的功能,大致上就分為兩種,簡單筆記如下,以免以後自己又忘了:


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感覺是很簡單的東西,解釋起來卻這麼複雜,也難怪我花了這麼久的時間才把他搞懂了...如果高手看到這篇還有我觀念錯誤的地方,還請不吝指教阿 ^^|||

沒有留言:

張貼留言