2012-05-10 71 views
8

在這裏有很多關於static vs global的問題,但我認爲我的問題有點不同。在文件之間共享靜態變量:namespace vs class

我想知道是否有一種方法可以共享放置在名稱空間中的變量,這些變量可以通過類中的靜態變量的方式跨文件進行。

例如,我編寫這樣的:

//Foo.h 
class Foo 
{ 
    public: 
    static int code; 
    static int times_two(int in_); 
}; 

namespace bar 
{ 
    static int kode; 
} 

-

//Foo.cpp 
int Foo::code = 0; 

int Foo::times_two(int in_) 
{ 
    bar::kode++; 
    code++; 
    return 2*in_; 
} 

-

//main.cpp 
int main() 
{ 
    cout << "Foo::code = " << Foo::code << endl; 

    for(int i=2; i < 6; i++) 
    { 
    cout << "2 x " << i << " = " << Foo::times_two(i) << endl; 
    cout << "Foo::code = " << Foo::code << endl; 
    cout << "bar::kode = " << bar::kode << endl; 

    if(i == 3) 
    { 
     bar::kode++; 
    } 
    } 
} 

所有這一切產生了這個代碼和科德:

Foo::code = 1,2,3,4 
bar::kode = 0,0,1,1 

再次,是否有辦法共享一個變量放置在命名空間跨文件的方式靜態變量可以在類中?我問的原因是因爲我認爲我可以通過使用::符號來保護自己免受全局變量衝突,並且發現我不能。就像任何不自信的程序員一樣,我相信我做錯了。

+1

'static'可能是在C中最重載關鍵字++。這意味着在這兩種情況下有所不同。 – Flexo

+1

......在這種特殊情況下,恰恰與你想要的相反。 –

回答

19

是:一classstruct

//bar.h 
namespace bar 
{ 
    extern int kode; 
} 

外,static有着完全不同的意義。它給符號內部聯繫。因此,如果您聲明與static相同的變量,則實際上您將獲得所有翻譯單元的不同副本,而不是唯一的全局變量。

請注意,你需要初始化變量一次

//bar.cpp 
namespace bar 
{ 
    int kode = 1337; 
} 
+4

@Morpork:請注意'kode'在這裏被聲明爲'extern',而不是'static'。這很重要。 –

+0

@John是的,我有一種感覺,當涉及多個文件時,沒有避免extern。除了一門課程中的靜態變量。感謝所有非常快速的迴應。 – Morpork

+2

@Morpork我真的不明白爲什麼人們想避免外部...... –