2012-02-23 141 views
0

我有一個全球性的int我想在不同的文件改變,由於某種原因,這是行不通的。全局變量不起作用

我:

//test.h

#include <windows.h> 

static int start1; //want to use this globally. 

//declare 
void something(); 

//test.cpp

#include "test.h" 

extern int start1; 

void something() 
{ 
    start1 = start1 + 1; 
} 

//main.cpp

#include "test.h" 
#include "stdafx.h" 
#include <iostream> 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    start1 = 3; 
    something(); 
    return 0; 
} 

爲什麼時,你去something()start1 0,而不是3?我一直試圖讓一個全局變量在幾個小時內,而且它不起作用。請有人澄清?

回答

10

不要聲明在頭文件中的static變量。這將導致包含該頭文件的每個翻譯單元(即源文件)存在單獨的變量。

的規範圖案是聲明變量如在頭文件extern,然後把它定義「通常」在一個源文件。

+0

但實際情況並非test.h和main.cpp中都在同一個翻譯單元反正? – 2012-02-23 16:03:38

+1

@TonyTheLion:'test.h'被多個源文件包含,因此會影響多個翻譯單元。 – 2012-02-23 16:04:49

3

您必須聲明你的INT在你的頭EXTERN。當您在.cpp文件中定義它時,它不需要任何限定符。靜態限定符實際上意味着您正在聲明的int只能在當前的翻譯單元中訪問,因此每個.cpp文件都將獲得其不同的版本。

0

如果你把

static int start1; 

所有源文件,你會得到一個靜態的效果,該數據將在每個單獨的地址。 然後,您可以爲每個單元保留的單獨值/內容。

但是。這不是一個全球變量本身。全局變量是單位之間共享的變量,而不是相反。因此,靜態行爲和全局(外部)內容有所不同......所以上述答案是正確的,但我認爲我可能會在討論中增加一點觀點。

我只是跑了類似的設置在C,和靜態變量作用相同。