C語言中static與extern的用法
在C語言中,static與extern的用法
(1)修飾區域性變數
a.一般情況下,對於區域性變數是存放在棧區的,並且區域性變數的生命週期在該語句塊執行結束時便結束了。但是如果用static進行修飾的話,該變數便存放在靜態資料區,其生命週期一直持續到整個程式執行結束;
b.對靜態區域性變數是在編譯時賦初值的,即只賦初值一次,在程式執行時它已有初值。以後每次呼叫函式時不再重新賦初值而是保留上次函式呼叫結束時的值;
c.如果在定義區域性變數時不賦初值的話,對靜態區域性變數來說,編譯時自動賦初值0(對數值型變數)或空字元(對字元變數)。而對自動變數來說如果不賦初值則它的值是一個不確定的值;
d.雖然靜態區域性變數在函式呼叫結束後仍然存在,但其他函式不能引用它。
什麼情況下需要用區域性靜態變數呢?
a.需要保留函式上一次呼叫結束時的值;
eg:
#include<stdio.h>
void fun()
{
static int a=1; a++;
printf("%d\n",a);
}
int main(void)
{
fun();
fun();
return 0;
}
程式執行結果為: 2 3
說明在第二次呼叫fun()函式時,a的值為2,並且沒有進行初始化賦值,直接進行自增運算,所以得到的結果為3.
b.如果初始化後,變數只引用而不改變其值,則這時用靜態區域性變數比較方便,以免每次呼叫時重新賦值
(2)修飾全域性變數
static修飾全域性變數只能在本檔案中使用。如果一個全域性變數,它既可以在本原始檔中被訪問到,也可以在同一個工程的其它原始檔中被訪問就需要用到extern.
eg:
file1.c
int a=1;
file2.c
#include
extern int a;
int main(void)
{
printf("%d\",a);
return 0;
}
則執行結果為 1
但是如果在file1.c中把int a=1改為static int a=1;
那麼在file2.c是無法訪問到變數a的。原因在於用static對全域性變數進行修飾其作用域僅侷限於本檔案。
(3)內部函式和外部函式
用static修飾函式稱為靜態函式(也叫內部函式),對函式的作用域僅侷限於本檔案。這樣不同的人編寫不同的函式時不用擔心自己定義的函式是否會與其它檔案中的函式同名,因為同名也沒關係
eg:
a.c
static int i;//只在a.c中可用
int j;//工程裡用
static int funA() //只在a.c中可用
{
}
int funB()//工程裡用
{
}
用extern修飾函式稱為外部函式,可供其他檔案呼叫。函式首部可以寫為
extern int fun(int a,int b)
這樣函式fun就可以為其他檔案呼叫。C語言規定,如果在定義函式時省略extern,則隱含為外部函式