static函式和變數
轉自:http://hi.baidu.com/jwjin/blog/item/037fe544bd8fd683b3b7dc3b.html
用static宣告的變數在C語言中有兩方面的特徵:
1)變數會被放在程式的全域性儲存區中,這樣可以在下一次呼叫的時候還可以保持原來的賦值。這一點是它與堆疊變數和堆變數的區別。
2)變數用static告知編譯器,自己僅僅在變數的作用範圍內可見。這一點是它與全域性變數的區別。
Tips:
A.若全域性變數僅在單個C檔案中訪問,則可以將這個變數修改為靜態全域性變數,以降低模組間的耦合度;
B.若全域性變數僅由單個函式訪問,則可以將這個變數改為該函式的靜態區域性變數,以降低模組間的耦合度;
C.設計和使用訪問動態全域性變數、靜態全域性變數、靜態區域性變數的函式時,需要考慮重入問題;
D.如果我們需要一個可重入的函式,那麼,我們一定要避免函式中使用static變數(這樣的函式被稱為:帶“內部儲存器”功能的的函式)
E.函式中必須要使用static變數情況:比如當某函式的返回值為指標型別時,則必須是static的區域性變數的地址作為返回值,若為auto型別,則返回為錯指標。
函式前加static使得函式成為靜態函式。但此處“static”的含義不是指儲存方式,而是指對函式的作用域僅侷限於本檔案(所以又稱內部函式)。使用內部函式的好處是:不同的人編寫不同的函式時,不用擔心自己定義的函式,是否會與其它檔案中的函式同名。
擴充套件分析:
術語static有著不尋常的歷史。起初,在C中引入關鍵字static是為了表示退出一個塊後仍然存在的區域性變數。隨後,static在C中有了第二種含義:用來表示不能被其它檔案訪問的全域性變數和函式。為了避免引入新的關鍵字,所以仍使用static關鍵字來表示這第二種含義。最後,C++重用了這個關鍵字,並賦予它與前面不同的第三種含義:表示屬於一個類而不是屬於此類的任何特定物件的變數和函式(與Java中此關鍵字的含義相同)。