全域性變數和靜態變數的區別
而靜態變數不具有外部連線性,即同一工程中其它檔案中不可以引用。
例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
相關文章
- 區域性變數和全域性變數(靜態和非靜態)區別變數
- 靜態全域性變數和全域性變數變數
- C語言區域性變數、全域性變數、靜態區域性變數、靜態全域性變數C語言變數
- 成員變數、全域性變數、例項變數、類變數、靜態變數和區域性變數的區別變數
- 靜態變數和例項變數區別?變數
- 區域性變數和全域性變數變數
- iOS 靜變數static、全域性變數extern、區域性變數、例項變數iOS變數
- java 全域性變數和區域性變數Java變數
- JavaScript —— 區域性變數和全域性變數JavaScript變數
- jmeter全域性變數和區域性變數JMeter變數
- Python中的全域性變數和區域性變數Python變數
- js-js的全域性變數和區域性變數JS變數
- 全域性變數與區域性變數變數
- 靜態變數和非靜態變數變數
- python全域性變數和區域性變數, globalPython變數
- 修改全域性變數時,可變型別和不可變型別的區別變數型別
- javascript中的作用域(全域性變數和區域性變數)JavaScript變數
- Python的區域性變數和全域性變數使用解惑Python變數
- 記憶體分配知識(全域性,區域性,靜態變數)記憶體變數
- Java區域性變數與全域性變數Java變數
- 【c】全域性變數與區域性變數變數
- 成員變數和區域性變數的區別變數
- python全域性變數與區域性變數Python變數
- Python的全域性和區域性變數Python變數
- JavaScript五:全域性變數&區域性變數;運算子JavaScript變數
- C語言--靜態區域性變數C語言變數
- node 全域性物件和全域性變數物件變數
- Python全域性變數與區域性變數詳解Python變數
- 詳解python 區域性變數與全域性變數Python變數
- 全域性變數變數
- Dll堆疊問題(Dll的靜態變數與全域性變數、vs的MT與MD)變數
- 記一個全域性變數"冒充"區域性變數引起的bug變數
- 靜態變數和Session變數Session
- java執行緒安全問題之靜態變數、例項變數、區域性變數Java執行緒變數
- 變數的分類(臨時(本地)變數、環境變數、全域性變數和系統變數)變數
- Java基礎-成員變數和區域性變數的區別Java變數
- angular中定義全域性變數及全域性變數的使用Angular變數
- 靜態變數變數