2012-05-09 152 views
1

如何在C++中使用可在不同頭文件中訪問的命名空間。可以說我有下面這樣:C++中的命名空間

// namespaces 
#include <iostream> 
using namespace std; 

namespace first 
{ 
    int var = 5; 
} 

namespace second 
{ 
    double var = 3.1416; 
} 

int main() { 
    cout << first::var << endl; 
    cout << second::var << endl; 
    return 0; 
} 

,我想T選用var變量。從第一個命名空間中的另一個類......被定義而在另一個h和.cpp文件中實現?

//server.h 
    #ifndef SERVER_H 
    #define SERVER_H 
    class server{ 
     server(); 
    //blah 
    }; 
    #endif SERVER_H 

//server.cpp 
server::server() 
{ 
    first::var = 3; 
} 

是否可以這樣做?當我嘗試時,我得到一個錯誤,說我的名字空間沒有定義。如果我把使用命名空間先在.h或.CPP它說沒有命名空間第一個叫...

+1

您應該將這些名稱空間放在一個頭文件中,並將其包含在您需要的位置。 – chris

+1

不要做這個!爲什麼你在1天后徹底改變了這個問題?問一個新問題。 –

回答

10

除了有一個頭的命名空間,你需要把這些變量的extern:

//header.h 
namespace first 
{ 
    extern int var; 
} 


//implementation.cpp 
#include "header.h" 
namespace first 
{ 
    int var = 5; 
} 

如果該變量不是extern,則會在包含標題的任何位置生成一個符號,並且會得到鏈接器錯誤。

如果你不想額外的頭,你可以聲明變量爲extern在同一個名字,你想用它:

//server.cpp 
namespace first 
{ 
    extern int var; 
} 
server::server() 
{ 
    first::var = 3; 
} 

注意一些答案也許會說,你應該使變量static。這是錯誤的,雖然它會編譯,因爲這個變量不會作爲一個全局變量。它的副本將爲每個翻譯單位創建。

+1

因爲我討厭這樣做,所以我從來沒有學過靜態爲每個翻譯單元製作一個副本。謝謝(你的)信息!另外@CrazyEddie我們都會錯過C++的角落片斷,不要對人們過分苛刻,呃? –

+0

@CrazyEddie我知道,經過編輯,可以在您評論之前反映出來。 –

+0

雖然在執行cpp:我會做'int first :: var = 5;' –