C语言中:在头文件中使用static定义变量意味着什么?
C語言中:在頭文件中使用static定義變量意味著什么?
看到有一位同學(xué)在頭文件中這么寫:
這種定義變量的方式我從來沒有見過,而且它還能順利通過編譯,于是我很想知道編譯器是如何處理這種變量定義的。
定義全局變量時(shí)使用static,意味著該變量的作用域只限于定義它的源文件中,其它源文件不能訪問。既然這種定義方式出現(xiàn)在頭文件中,那么可以很自然地推測(cè):包含了該頭文件的所有源文件中都定義了這些變量,即該頭文件被包含了多少次,這些變量就定義了多少次。
假如將上面兩行代碼的static去掉,編譯的時(shí)候就會(huì)出現(xiàn)變量重定義的錯(cuò)誤,這進(jìn)一步證實(shí)了上面的推測(cè),因?yàn)闆]有static的話變量的作用域是全局的,定義了兩個(gè)以上的同名變量就會(huì)出現(xiàn)該錯(cuò)誤。
?
推測(cè)終究是推測(cè),要真正證實(shí)這個(gè)推測(cè)還要通過寫代碼來驗(yàn)證。驗(yàn)證的方式是:在頭文件中使用static定義變量,在多個(gè)源文件中包含該頭文件,然后在每個(gè)源文件中輸出變量的地址,同時(shí)在一個(gè)源文件中改變變量的值并輸出,在另一個(gè)源文件中也輸出。如果每個(gè)源文件的輸出都不同,則推測(cè)得證;否則推測(cè)是錯(cuò)誤的。
?
下面是定義變量的頭文件的代碼:
//Header.h #pragma oncestatic int g_int = 3;?
接下來在另一個(gè)頭文件中聲明兩個(gè)測(cè)試函數(shù):
//Functions.h #pragma oncevoid TestSource1(); void TestSource2();?
分別在兩個(gè)源文件中定義這兩個(gè)測(cè)試函數(shù):
//Source1.cpp #include <stdio.h> #include "Header.h"void TestSource1() {wprintf(L"g_int's address in Source1.cpp: %08x\n", &g_int);g_int = 5;wprintf(L"g_int's value in Source1.cpp: %d\n", g_int); } //Source2.cpp #include <stdio.h> #include "Header.h"void TestSource2() {wprintf(L"g_int's address in Source2.cpp: %08x\n", &g_int);wprintf(L"g_int's value in Source2.cpp: %d\n", g_int); }最后在main函數(shù)中調(diào)用這兩個(gè)測(cè)試函數(shù):
?
運(yùn)行該程序:
可以看到,雖然在代碼中好像使用了相同的變量,但是實(shí)際上使用的是不同的變量,在每個(gè)源文件中都有單獨(dú)的變量。所以,在頭文件中定義static變量會(huì)造成變量多次定義,造成內(nèi)存空間的浪費(fèi),而且也不是真正的全局變量。應(yīng)該避免使用這種定義方式。
?
作為對(duì)比,下面使用正確的方式來定義全局變量:
//Header.h #pragma onceextern int g_int;//Source1.cpp #include <stdio.h> #include "Header.h"int g_int = 3;void TestSource1() {wprintf(L"g_int's address in Source1.cpp: %08x\n", &g_int);g_int = 5;wprintf(L"g_int's value in Source1.cpp: %d\n", g_int); }?
其它文件不變。
運(yùn)行程序:
可以看到,這次兩個(gè)源文件中使用的都是同一個(gè)變量。要注意的是,使用extern聲明變量時(shí)不能帶有初始值,否則仍然屬于變量定義,會(huì)出現(xiàn)變量重定義的錯(cuò)誤。
總結(jié)
以上是生活随笔為你收集整理的C语言中:在头文件中使用static定义变量意味着什么?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 口语学习Day3:今天聊聊菜单
- 下一篇: 求p1+5和p2+5等于多少?