從學C語言開始,至始至終都沒有弄懂 variable 或 function 前加個 Static 的作用到底是甚麼,網路上找了一些資料,參考參考
--
from: stackoverflow
http://stackoverflow.com/questions/15235526/the-static-keyword-and-its-various-uses-in-c
--
from: MSDN
https://msdn.microsoft.com/zh-tw/library/s1sb61xd.aspx
--
區域變數
一般的區域變數是在每次進此區域時才重新建立初始化, 在離開該區域時, 結束掉該變數的存在; 如果區域變數前面有個 static 就不一樣了, 它將是一個永續存在的空間, 但對 compiler 來說, 卻不允許除該區域之外的程式碼以變數名稱來存取這個變數.
全域變數
而全域變數則是永續存在且所有的 .c 檔都可以經由宣告而來存取的; 而加上了 static 後, compiler 即不允許除了該 .c 檔之外的其它 .c 檔以變數名稱來存取該變數, 即使它們未來是要 link 在一起成一個執行檔也一樣不允許.
函式
一般的函式只要存在, 即可經由宣告來呼叫該函式; 若在該函式前加入 static 的指定的話, 則同全域變數一般, 不允許除該函式所在的 .c 檔之外的程式碼以該函式的名稱來呼叫此靜態函式, 此也意即用 function pointer 的方式是可以的.
用 static 在全域變數或 function 上有好處是可以減少 compiler 在做 linking 時所建立的 global symbol table 的 size, 也可以減少 symbol 名稱相同的機會, 而在區域變數上, 也可以省卻使用 global variable 的方式, 用簡易的方式宣告且使用位於 heap 的變數, 且我們可以知道該靜態區域變數只會為此區域所用. :)