日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言中:在头文件中使用static定义变量意味着什么?

發布時間:2025/6/15 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言中:在头文件中使用static定义变量意味着什么? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C語言中:在頭文件中使用static定義變量意味著什么?
看到有一位同學在頭文件中這么寫:

static const wchar_t* g_str1 = … static const wchar_t* g_str2 = …


這種定義變量的方式我從來沒有見過,而且它還能順利通過編譯,于是我很想知道編譯器是如何處理這種變量定義的。

定義全局變量時使用static,意味著該變量的作用域只限于定義它的源文件中,其它源文件不能訪問。既然這種定義方式出現在頭文件中,那么可以很自然地推測:包含了該頭文件的所有源文件中都定義了這些變量,即該頭文件被包含了多少次,這些變量就定義了多少次。

假如將上面兩行代碼的static去掉,編譯的時候就會出現變量重定義的錯誤,這進一步證實了上面的推測,因為沒有static的話變量的作用域是全局的,定義了兩個以上的同名變量就會出現該錯誤。

?

推測終究是推測,要真正證實這個推測還要通過寫代碼來驗證。驗證的方式是:在頭文件中使用static定義變量,在多個源文件中包含該頭文件,然后在每個源文件中輸出變量的地址,同時在一個源文件中改變變量的值并輸出,在另一個源文件中也輸出。如果每個源文件的輸出都不同,則推測得證;否則推測是錯誤的。

?

下面是定義變量的頭文件的代碼:

//Header.h #pragma oncestatic int g_int = 3;

?

接下來在另一個頭文件中聲明兩個測試函數:

//Functions.h #pragma oncevoid TestSource1(); void TestSource2();

?

分別在兩個源文件中定義這兩個測試函數:

//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函數中調用這兩個測試函數:


?

//Main.cpp #include "Functions.h"int wmain() {TestSource1();TestSource2(); }

運行該程序:

可以看到,雖然在代碼中好像使用了相同的變量,但是實際上使用的是不同的變量,在每個源文件中都有單獨的變量。所以,在頭文件中定義static變量會造成變量多次定義,造成內存空間的浪費,而且也不是真正的全局變量。應該避免使用這種定義方式。

?

作為對比,下面使用正確的方式來定義全局變量:

//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); }

?

其它文件不變。

運行程序:

可以看到,這次兩個源文件中使用的都是同一個變量。要注意的是,使用extern聲明變量時不能帶有初始值,否則仍然屬于變量定義,會出現變量重定義的錯誤。

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的C语言中:在头文件中使用static定义变量意味着什么?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。