static和extern的用法小結

2022-09-01 02:51:07 字數 3024 閱讀 7342

如果在程式中某個地方定義了乙個外部變數, 那麼使用extern就可以擴充套件它的作用域。

舉個栗子

1 #include 2

3using

namespace

std;

4void

fun();56

intmain()713

14int

t;15

void

fun()

16

輸出為

如果沒有extern那句,主函式在執行到  cout << "t=" << t <

時,就不知道 t 是啥玩意。

但是要說明一點, 即使沒有extern那句, fun() 函式也能順利執行。

栗子:

1 #include 2
3using

namespace

std;

4void

fun();56

intmain()712

13int t = 3;14

void

fun()

15輸出為

這是因為int t = 3 這句的作用域已經包含了fun()函式了。

當你想在乙個工程裡用多個檔案來寫整個大程式,那麼你在乙個檔案裡定義了乙個全域性變數(外部變數), 不作宣告的話,另乙個檔案是找不到這個變數的, 不像寫在乙個檔案裡那麼簡單。

這時就可以用extern來搞事了。其實這一點完全可以模擬上乙個作用,也就是說明extern不僅可以在乙個檔案裡擴充套件作用域,在整個工程裡都是可以的。

栗子:

檔案

1 #include 2

3using

namespace

std;

4void

fun();56

intt;

7int

main()

8

//另乙個.c檔案

1 #include 2

3using

namespace

std;45

extern

intt;

6void

fun()

7

輸出

有必要說明一下,extern宣告的必須得是外部變數,即定義在函式外面的變數, 要是你把第乙個點的程式裡面int t 寫在子函式內部, 就會報錯。第二點的也不能寫在子函式裡面。

/***************************分割線***********************/

比如上面第一點中如果在int t 的前面加上static,那麼extern不起作用了,就會報錯。第二點也是這樣。通常乙個大工程會分給好多人一起寫,如果乙個人確定自己這個檔案裡的這個變數不會被其它檔案使用,又不想被其它檔案誤用, 就加個static,起到隔離的作用。

我們知道在乙個函式裡定義的變數,會在函式呼叫結束後被抹去,就像做夢一樣,什麼都沒了。但是如果在函式裡的某個變數前加乙個static, 它的值就不會消失,好比你下次做夢還能接著上次的做。。。

舉個栗子

1 #include 2

3using

namespace

std;

4void

fun();56

intmain()712

13void

fun()

14

輸出

如果沒有static,就會輸出3個2。

也就是說static int t = 1;

這句話只會執行一遍,即初始化t 只有一遍。之後再到這裡,它會直接跳過。

但是有人會說,這個不就和寫乙個大全域性變數的用法重複了嗎。確實,如果你在main函式前面直接定義乙個全域性變數int t; 實現效果是一樣的

**為

1 #include 2

3using

namespace

std;

4void

fun();

5int t = 1;6

intmain()712

13void

fun()

14

輸出一樣。

但是,兩種做法其實並不一樣,要是用static來寫,那麼只是把t 的生存期變長了,作用域並不會改變。也就是說,t 這個變數雖然在函式呼叫結束後,其值並不會消失,但是並不能在函式外面使用它。

它只能在函式裡產生作用,在函式外面根本不知道有這個東西,甚至也可以定義乙個t 的變數,而且並不會產生衝突。好比說,你夢裡面幹的事只能在你夢裡幹,就算你每次做夢都接著上次的做,然而現實生活中別人是不知道你做了啥夢。

栗子

1 #include 2

3using

namespace

std;

4void

fun();56

intmain()716

17void

fun()

18

輸出為

此時就像正常沒有static 來處理t 一樣,二者不會產生衝突。很神奇。

在自己瞎搞的過程中,我還發現乙個現象。當你把剛剛那個**中main 函式裡的 int t = 100; 拿到main 函式外面,當成全域性變數, 輸出是一樣的。

不僅如此,你把它寫成全域性變數後,即使再把子函式裡的static去掉, 輸出還是一樣的。

這就說明了,乙個大全域性變數遇到子函式裡定義的長得一樣的小變數,大全域性變數並不會影響小變數,讀者可以自己試試。

我想可以這樣理解這種情況,當你定義了乙個大全域性變數後,全域性都可以使用,但是要是你在子函式中(不是main函式)也定義了乙個相同的變數,無論你是否用static,子函式就按子函式定義的來搞,子函式結束,並不會影響你的大全域性變數。

static和extern的區別

static 一 在c中,static主要定義全域性靜態變數 定義區域性靜態變數 定義靜態函式。1 定義全域性靜態變數 在全域性變數前面加上關鍵字static,該全域性變數變成了全域性靜態變數。全域性靜態變數有以下特點。a.在全域性區分配記憶體。b.如果沒有初始化,其預設值為0.c.該變數在本檔案內...

static和extern的區別

static 一 在c中,static主要定義全域性靜態變數 定義區域性靜態變數 定義靜態函式。1 定義全域性靜態變數 在全域性變數前面加上關鍵字static,該全域性變數變成了全域性靜態變數。全域性靜態變數有以下特點。a.在全域性區分配記憶體。b.如果沒有初始化,其預設值為0.c.該變數在本檔案內...

static和extern的使用

1 修飾區域性變數 static修飾區域性變數,該區域性變數便存放在靜態資料區,其生命週期一直持續到整個程式執行結束,但作用域仍限於該語句塊。特別注意的是,用static修飾區域性變數後,該變數只在初次執行時進行初始化工作,且只進行一次。includevoid fun int main void 程...