2013-04-18 64 views
2
FileA.hpp: 

static int a; 
void change(int); 

FileA.cpp 

#include "FileA.hpp" 
void change(int x) { a = x; } 

main.cpp 

#include "FileA.hpp" 
#include <cstdlib> 
#include <iostream> 

int main() 
{ 
    a = 5; 
    std::cout<<a<<std::endl; 
    change(10); 
    std::cout<<a<<std::endl; 
    a = 20; 
    std::cout<<a<<std::endl; 

    system("Pause"); 

    return 0; 
} 

我的輸出是:靜態變量CPP不想改變

5 
5 
20 

有人可以幫助我?爲什麼變量'a'不想在FileA.cpp中的函數 中更改。 如何解決這個問題。當我在「FileA.hpp」中內聯更改(int x)時,它可以正常工作。

回答

10

全局變量的static關鍵字給出了該變量的內部鏈接。這意味着具有該定義的任何翻譯單元都將擁有自己的對象副本。所以main.cpp看到的a對象和FileA.cpp看到的是不同的對象。 change將修改其中的一個,但main將輸出另一個。

如果您打算static意味着該對象具有靜態存儲持續時間,則全局變量(或通常名稱空間範圍內的變量)無論如何都具有靜態存儲持續時間。你不需要標記它們static。但是,如果刪除static,則會出現另一個問題;您將在翻譯單元中有多個定義a

正確的方法做,這是在FileA.hpp文件中聲明aextern

extern int a; 

在一個翻譯單元(大概然後在FileA.cpp,定義對象:

int a; 

這意味着包含FileA.hpp的任何對象的聲明將爲a(這很好),並且只有一個翻譯單元的定義爲a。完善。

+0

解決了,謝謝。 – Adrian

3

您在頭文件,其中包括在創建它的兩個副本,一個在main.cpp,一個在FileA.cpp聲明a。當你做a = 5;你分配給來自main.cpp的副本,而在調用函數change時,它會更改FileA.cpp中的副本。

+0

不錯,我第一次被愚弄了。我會更加小心這種包括。你的回答打開了我的眼睛 –

+1

你應該強調一個事實,即發生這種情況是因爲'a'聲明爲'static'。 – Angew