static用法:
在C中,static主要定義全局靜態變量、定義局部靜態變量、定義靜態函數。
1、定義全局靜態變量:在全局變量前面加上關鍵字static,該全局變量變成了全局靜態變量。全局靜態變量有以下特點。
a.在全局區分配內存。
b.如果沒有初始化,其默認值為0.
c.該變量在本文件內從定義開始到文件結束可見。
2、定義局部靜態變量:在局部變量前面加上關鍵字static,其特點如下:
a.該變量在全局數據區分配內存。
b.它始終駐留在全局數據區,直到程序運行結束。
c. 其作用域為局部作用域,當定義它的函數或語句塊結束時,其作用域隨之結束。
1 #include <stdio.h> 2 3 void fn(void) 4 { 5 int n = 10; 6 7 printf("n=%d\n", n); 8 n++; 9 printf("n++=%d\n", n); 10 } 11 12 void fn_static(void) 13 { 14 static int n = 10; 15 16 printf("static n=%d\n", n); 17 n++; 18 printf("n++=%d\n", n); 19 } 20 21 int main(void) 22 { 23 fn(); 24 printf("--------------------\n"); 25 fn_static(); 26 printf("--------------------\n"); 27 fn(); 28 printf("--------------------\n"); 29 fn_static(); 30 31 return 0; 32 }
-> % ./a.out n=10 n++=11 -------------------- static n=10 n++=11 -------------------- n=10 n++=11 -------------------- static n=11 n++=12
3、定義靜態函數:在函數返回類型前加上static關鍵字,函數即被定義為靜態函數,其特點如下:
a.靜態函數只能在本源文件中使用
b.在文件作用域中聲明的inline函數默認為static類型
/* file1.c */ #include <stdio.h> static void fun(void) { printf("hello from fun.\n"); } int main(void) { fun(); fun1(); return 0; } /* file2.c */ #include <stdio.h> static void fun1(void) { printf("hello from static fun1.\n"); }
/tmp/cc2VMzGR.o:在函數‘main’中: static_fun.c:(.text+0x20):對‘fun1’未定義的引用 collect2: error: ld returned 1 exit status
總結:用static定義的全局和局部靜態變量的區別是,全局的靜態變量的作用域和可見域都是從文件的定義開始到整個文件結束;而局部的靜態變量可見域是從文件的定義開始到整個文件結束,作用域是從該語句塊的定義開始到該語句塊結束。