2012-05-09 32 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;' –