2013-02-19 75 views
0

我試圖更新靜態INTC++更新靜態INT

test.h

static int Delay = 0; 
void UpdateDelay(); 

TEST.CPP

#include "test.h" 

void UpdateDelay(){ 
Delay = 500; 
} 

Main.cpp的

#include "test.h" 

    int main(){ 
    UpdateDelay(); 
    std::cout << Delay << std::endl; 
    return 0; 

} 

輸出應該是:500 但它表明:0

THX

+2

在這種情況下'static'意味着內部鏈接 - 每個翻譯單元將得到一個_different_'Delay'。 – ildjarn 2013-02-19 20:38:06

回答

6

聲明爲static全局變量具有internal linkage。這意味着每個翻譯單元(即.cpp文件)都會獲得該變量的私人副本。

對一個翻譯單元的私人副本所做的更改不會對由不同翻譯單元所擁有的相同變量的私人副本產生任何影響。

如果你想分享一個全局變量,爲它提供一個定義在一個翻譯單元,並讓所有其他的翻譯單元是指它通過聲明指定extern關鍵字:

test.h

extern int Delay; 
void UpdateDelay(); 

TEST.CPP

#include "test.h" 

void UpdateDelay(){ 
    Delay = 500; 
} 

的main.cpp

#include "test.h" 

int Delay = 0; // Do not declare this as static, or you will give 
       // internal linkage to this variable. That means it 
       // won't be visible from other translation units. 

int main(){ 
    UpdateDelay(); 
    std::cout << Delay << std::endl; 
    return 0; 
} 
+0

thx很多,我現在明白了,它工作正常:) – 2013-02-19 20:52:32

+0

@beshoyMounir:很高興它幫助:-) – 2013-02-19 21:21:59

0

不能聲明在你的.h會發生什麼static int Delay每CPP是它讓自己的版本 「延遲」 的

你想要什麼要做的就是在test.cpp中聲明static int延遲剛好在UpdateDelay上面

3

如果你把static int Delay放在.h文件中,那麼每個.cpp文件都會有它自己獨特的實例。

你想使用extern。

test.h

extern int Delay; 
void UpdateDelay(); 

TEST.CPP

#include "test.h" 
int Delay = 0; 

void UpdateDelay() 
{ 
    Delay = 500; 
} 
+0

你不能使用'static'來定義'延遲',或者你會給它內部的連接,它將不可見內'main.cpp' – 2013-02-19 20:48:39

+0

@AndyProwl固定。謝謝 – 2013-02-19 20:51:03

0

在這種用法中,關鍵字static意味着每個CPP文件有一個名爲Delay可變自己獨立的副本。所以UpdateDelay()改變的不是main()打印的那個。

如果您想使用單個變量,請將其替換爲extern:在頭文件中,輸入extern int Delay;。在一個源文件中,輸入int Delay = 0;