一、基本概念
局部變量:函數內部定義的變量(包括定義在函數內部複合語句中的變量)。
全局變量:定義在函數外部的變量。
作用域:任何標識符(包括變量、函數名、符號常量及新的數據名)都有它的作用範圍,此範圍稱爲該標識符的作用域。比如符號常量的作用域是從定義符號常量的地方開始到包含這個#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.設計和使用訪問動態全局變量、靜態全局變量、靜態局部變量的函數時,需要考慮重入問題。
C語言中的extern和static關鍵字詳解
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.