久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

[C/C++]在頭文件中使用static定義變量意味著什么

 心不留意外塵 2016-05-23

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

2011

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

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

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

 

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

 

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

 

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

 

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

//Header.h
#pragma once

static int g_int = 3;

 

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

//Functions.h
#pragma once

void TestSource1();
void TestSource2();

 

分別在兩個源文件中定義這兩個測試函數(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)用這兩個測試函數(shù):

//Main.cpp
#include "Functions.h"

int wmain() {

	TestSource1();
	TestSource2();
}

 

運行該程序:

clip_image002[4]

 

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

 

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

//Header.h
#pragma once

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

 

其它文件不變,。

 

運行程序:

clip_image002[6]

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

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多