全域性變數和靜態變數的區別

-柚子皮-發表於2014-06-08
全域性變數具有外部連線性,即同一工程中其它檔案中的也可引用。
而靜態變數不具有外部連線性,即同一工程中其它檔案中不可以引用。

例1:
//cpp1.cpp
extern int x=10;
static int y=5;

//cpp2.cpp
#include <iostream.h>
void main(){
    extern int x;
    extern int y;
    cout<<x<<endl;
    cout<<y<<endl;
}

將這兩個檔案放在同一工程中,你發現每一檔案單獨編譯能通過,但作為工程不能構成.exe檔案執行。若將有關變數y的行註釋後(或將static換成extern)就可以了。這是因為靜態變數的作用域在本檔案內,不能擴充到其它檔案。其作用是當多人合作開發一個工程時,僅在自己的檔案內使用的全域性變數用靜態變數不會與其他人用的變數相混淆,這就是識別符號的一致性。


例2:

static __inline__ bool Is_Queue_Empty(void);//geekos keyboard.c

說明函式的作用域僅僅是定義它們的檔案。與之相反的關鍵字是'extern'


變數可以分為全域性變數、靜態全域性變數、靜態區域性變數和區域性變數
按儲存區域分:全域性變數、靜態全域性變數和靜態區域性變數都存放在記憶體的全域性資料區,區域性變數存放在記憶體的棧區
按作用域分:全域性變數在整個工程檔案內都有效;靜態全域性變數只在定義它的檔案內有效;靜態區域性變數只在定義它的函式內有效,只是程式僅分配一次記憶體,函式返回後,該變數不會消失;區域性變數在定義它的函式內有效,但是函式返回後失效。
全域性變數和靜態變數如果沒有手工初始化,則由編譯器初始化為0。區域性變數的值不可知。
程式碼如下:
//test.cpp
#include <iostream.h>
extern int a;//變數宣告,不是定義
static int b=5;
void func1(){
  cout<<b<<endl<<a<<endl;//結果為5
}

//main.cpp
int a;
int b=10;
void func2(){
  static int i;
  i++;
  cout<<i<<endl;
}

void func1();

void main(){
  a=20;
  func1();
  func2();
  func2();
}
輸出結果為
5
20
1
2


全域性靜態函式的應用比較常見的就是

static int fun(){

          ...;

          return 1;

}

當我們希望在多個類中呼叫fun函式時,我們必須把fun宣告為static型別,不然在link時編譯器會發現多個關於fun的定義。這種函式的應用,多少帶有C的色彩,尤其當我們在C環境寫好的函式,移植到C++中時,需要在函式前面需要加上static,而如果我們需要移植多個函式時,更通用的一種方法是使用未命名名字空間

namespace{

          int fun() {

               ...;

              return 1;

          }

          …

}


from:http://blog.csdn.net/pipisorry/article/details/29432147

ref:關於靜態函式的一些思考http://blog.csdn.net/ugg/article/details/1428872

http://bbs.csdn.net/topics/10104758

http://www.cppblog.com/Lee/archive/2009/03/19/77103.html

相關文章