在C程序開發過程中,很多人都忽視了靜态變量和靜态函數重大作用。筆者就遇到一位資深程序員,看到我寫的代碼裡有static标識,很好奇,我告訴他後,他立馬用到他程序裡面了~~。
靜态類型
根據static修飾的對象,可分為兩大類:在函數前面的和在變量前面的。
1. 放在函數前面在實際項目中,我們經常會定義這樣一些小函數,它們隻被定義他們的那個文件裡的其它函數調用,而不會被其它文件裡的函數調用,即局部函數。建議要這樣的函數前要加static,表明此函數的作用範圍是本文件,也隻能在本文件中使用,當然頭文件中也是不能出現這個函數申明的,否則會報錯。
來看一個例子,同一個項目包含file1.c和file2.c
//file1.c中
int add(int x, int y) { return (x y); } void int funFile1(void) { return add(1, 2); }
//file2.c中
float add(float x, float y) { return (x y); } void float funFile2(void) { return add(1.1, 2.1); }
很明顯,編輯時會報add函數重複定義的錯誤。現在我們在add前面加上static試試。
//file1.c中
static int add(int x, int y) { return (x y); }
//調用本文件中static函數
void int funFile1(void) { return add(1,2); }
//file2.c中
static float add(float x, float y) { return (x y); }
//調用本文件中static函數
void float funFile2(void) { return add(1, 2); }
編輯通過,完全正确。說明在同一個項目中,不同文件中含有相同名字的static函數是允許的。這個功能在多人合作的大項目中,特别有用,隻要大家定義好接口函數,可以極大的避免同文件名的錯誤。
2.放在變量前面分在函數内和在函數外兩種情況,關于static變量在内存中的位置,詳見關于内存堆棧
2.1 函數内的static變量
函數内的static變量隻能被本函數調用,其特點是隻能被初始化一次,而且,退出函數後其值會保持,限于函數内的“全局”變量.
//每調用一次,val值增1 void int getCount(void) { //編輯時完成初始化值為1 static int val=1; val ; return val; }
2.2 函數外的static變量
定義在函數外的static變量隻能被本文件中的函數使用,不能被其它文件使用。來看例子,同一個項目包含file1.c和file2.c
//file1.c
//編輯時完成初始化值為1 //與file2中的val沒關系 static int val=1; void int incCount(void) { val ; return val; } //靜态函數 (限file1.c) static void int decCount(void) { val--; return val; }
//file2.c
//編輯時完成初始化值為10 //與file1中的val沒關系 static int val=10; void int inc(void) { val ; return val; } //靜态函數 (限file2.c) static void int decCount(void) { val--; return val; }
編譯通過,完全正确。同一項目中的不同文件含有同名靜态變量允許存在,其作用域與靜态函數一緻。
碼字不易,謝謝關注,你的點贊是我最大的動力。共享知識,共同成長!
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!