C語言中的extern和static關鍵字詳解

一、基本概念

局部變量:函數內部定義的變量(包括定義在函數內部複合語句中的變量)。

全局變量:定義在函數外部的變量。

作用域:任何標識符(包括變量、函數名、符號常量及新的數據名)都有它的作用範圍,此範圍稱爲該標識符的作用域。比如符號常量的作用域是從定義符號常量的地方開始到包含這個#define命令(作用於該符號常量)的文件末尾或者遇到#undef命令(作用於該符號常量)爲止。


二、函數作用

關鍵字extern可置於變量或者函數前,以表示變量或者函數的定義在別的文件中,提示編譯器遇到此變量或函數時,在其它模塊中尋找其定義。

關鍵字static也可置於變量或者函數前,static可以用於修飾局部變量以擴展其生存期(使其在被調用的函數前就生成,直到程序退出才消亡),也可以用於修飾全局變量,此時它的作用在於限制該全局變量的作用域,使其只有在定義該全局變量的文件中才能使用。另外,對於static還可以將函數聲明爲內部函數(靜態函數),使該函數只能在其定義所在的文件中使用。若在不同文件中存在同名的內部函數,則互不干擾。

三、應用實例

在實際的工程中可能會有很多的源文件,我們假設一個項目中存在源文件a.c和b.c。

源文件a.c如下:

static int i;                //只在a.c中用
int j; //在工程裏用
static void init()          //只在a.c中用
{
}
void callme()              //在工程中用
{
static int sum;            //只在callme函數中用
}

上面的全局變量i和init()函數只能用在a.c文檔中,全局變量sum的作用域只在callme裏。變量j和函數callme()的全侷限擴充到整個工程文檔。所以能夠在下面的b.c中用extern關鍵字調用。extern告訴編譯器這個變量或函數在其他文檔裏已被定義了。

源文件b.c如下:

extern int j;                //調用a文檔裏的
extern void callme();   //調用a文檔裏的
int main()
{
...
}


在編寫程序時,需要注意以下原則:

1.若全局變量僅在單個C文檔中訪問,則能夠將這個變量修改爲靜態全局變量,以降低模塊間的耦合度;

2.若全局變量僅由單個函數訪問,則能夠將這個變量改爲該函數的靜態局部變量,以降低模塊間的耦合度;

3.設計和使用訪問動態全局變量、靜態全局變量、靜態局部變量的函數時,需要考慮重入問題。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章