欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
[C/C++]在頭文件中使用static定義變量意味著(zhù)什么

http://www.cnblogs.com/zplutor/archive/2011/08/06/2129401.html

2011

看到有一位同學(xué)在頭文件中這么寫(xiě):

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

這種定義變量的方式我從來(lái)沒(méi)有見(jiàn)過(guò),而且它還能順利通過(guò)編譯,于是我很想知道編譯器是如何處理這種變量定義的。

 

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

 

假如將上面兩行代碼的static去掉,編譯的時(shí)候就會(huì )出現變量重定義的錯誤,這進(jìn)一步證實(shí)了上面的推測,因為沒(méi)有static的話(huà)變量的作用域是全局的,定義了兩個(gè)以上的同名變量就會(huì )出現該錯誤。

 

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

 

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

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

 

接下來(lái)在另一個(gè)頭文件中聲明兩個(gè)測試函數:

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

 

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

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

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

 

運行該程序:

 

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

 

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

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

 

其它文件不變。

 

運行程序:

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

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
c語(yǔ)言之函數參數傳遞之數組篇
C語(yǔ)言學(xué)習教程第五章-函數(8)
.h頭文件 .lib庫文件 .dll動(dòng)態(tài)鏈接庫文件關(guān)系
C 程序的外部變量與函數
C語(yǔ)言函數語(yǔ)法詳解
C語(yǔ)言static總結
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久