2012-02-23 138 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,和静态变量作用相同。