天天看點

C語言中static與extern用法總結前言-變量的儲存方法1、static與extern在變量存儲上的差別2、extern與static在函數定義上的差別-内部函數與外部函數參考資料

前言-變量的儲存方法

在C語言中,供使用者使用的儲存空間分為3個部分,程式區、靜态儲存區和動态儲存區。其中,程式區存放的是可執行程式的機器指令,靜态儲存區存放的是在程式運作期間需要占用固定儲存單元的變量,如全局變量;動态存儲區存放的是程式運作期間需要動态配置設定儲存空間的變量,如函數的形參變量、局部變量等。

變量的存儲屬性就是資料在記憶體中的存儲方法,可分為兩大類:動态存儲和靜态存儲。

1、static與extern在變量存儲上的差別

1.1.1static既可用于存儲局部變量,也可用于存儲全局變量

1.1.1static用于存儲局部靜态變量

如果希望函數調用結束後仍然保留其中定義的局部變量的值,則可将局部變量定義為局部靜态變量。一般形式為

static 類型說明符 變量名;
           

特點如下:

(1)局部靜态變量是在靜态存儲區配置設定儲存單元,在整個程式運作期間都不釋放。是以,在函數調用結束後,它的值并不消失,其值能夠保證連續性。

(2)局部靜态變量是在編譯過程中賦初值的,且隻賦一次初值,在程式運作期間其初值已定,以後每次調用函數時不再賦初值,而是保留上一次函數調用結束後的結果;

(3)局部靜态變量的預設初值為0(對數值型變量),或空字元(對字元型變量)。

1.1.2static用于存儲靜态全局變量

在程式設計時,如果希望在一個檔案中定義的全局變量僅限于被本檔案引用,而不能被其他檔案通路,則可以在定義此全局變量是,在前面加上關鍵字static。例如:

static int x;
           

注意,此時全局變量的作用于僅限于本檔案,在其他檔案中即使使用了extern說明,也無法使用該變量。(可看文全文後回頭再看這句話)

1.2extern用于存儲外部全局變量

對于一個很大的程式,為了編寫、調試、編譯和修改程式的友善,常把一個程式設計成多個檔案的子產品結構。每個子產品或檔案完成一個或幾個較小的功能。這樣,就可以先對每個子產品或每個檔案進行單獨編譯,然後再講各子產品連接配接在一起。是以,在多個源程式檔案的情況下,如果在一個檔案中要引用其他檔案中定義的全局變量,則需要在引用此變量的檔案中,用extern進行說明。

例如在prog1.c中存在一個全局變量a,如果想在prog2.c中使用全局變量a,則需要在prog2.c中提前說明:

extern int a;
           

這行語句說明該變量a已經在其他檔案中被定義過,本檔案不必在為其配置設定記憶體。

注意:

(1)extern隻能用來說明變量,不能用來定義變量,因為其不産生新的變量,隻是宣布該變量已經在其他地方有過定義。是以,供其他檔案通路的全局變量,在程式中隻能定義一次,但是在不同的地方可以多次被說明為外部變量。

(2)extern不能用于初始化變量,例如

extern int x=1;
           

為錯誤用法。

(3)靜态全部變量與外部全局變量在同一檔案内的作用域是一樣的,但是外部全局變量的作用域可延伸至其他程式檔案,而靜态全局變量在被定義的源程式檔案以外是不可見的。

2、extern與static在函數定義上的差別-内部函數與外部函數

2.1 static與内部函數

内部函數也稱為靜态函數,它隻能被本檔案中的其他函數所調用。此處的“靜态”不是指存儲方式,而是指對函數的作用域僅限于本檔案。内部函數定義的一般形式:

static 類型說明符 函數名 (形式參數生命)
           

例如:

static float sum(float x, float y)
{
}
           

使用内部函數的意義

使用内部函數,可以使函數的使用範圍僅限于本檔案,如果在不同的檔案中有同名的内部函數,也不會互相幹擾。這樣有利于不同的人分工編寫不同的函數,而不必擔心函數是否同名。

2.2 extern 與外部函數

在定義函數時,如果使用了關鍵字extern ,表明此函數是外部函數。例如:

extern char compare( char s1, char s2)
{
}
           

由于函數都是外部性質的,是以在定義函數時,關鍵字extern可以省略。

但是,在調用函數的檔案中,一般要用extern說明所調用的函數是外部函數。例如,若在源檔案A中調用另一源檔案B中的函數compare,則需要在源檔案A中對函數compare進行說明,格式如下:

extern char compare();
           

參考資料

本文主要參考《C語言程式設計教程》第3版, 朱鳴華等編著。

繼續閱讀