2015-05-13 58 views
0

之外的外部变量我目前使用一个命名空间来保存了一套应该是项目中的所有类使用的变量。一些变量应该是常量,并且是在名称空间本身中定义的,对于其他变量则应该稍后分配。例如:分配值在C++的命名空间

// MyProject.h 
namespace MyNameSpace { 
    extern const double a = 1.0; 
    extern const int b = 2; 
    extern double c; 
    extern int d; 
} 

// MyProject.cpp 
MyNameSpace::c = 3.0; 
MyNameSpace::d = 4; 

然而,这将返回错误的变量c和d:

error LNK2001: unresolved external symbol "int MyNameSpace::c" 
error LNK2001: unresolved external symbol "double MyNameSpace::d" 

什么是之后的声明命名空间以外分配值外部变量的正确方法是什么?

+0

命名空间是一个红色的鲱鱼 - 没有它你会有同样的问题。 – molbdnilo

回答

1

的extern意味着变量将在其他地方定义。所以,你不能在你的名字空间中赋值给extern变量。你需要在一些cpp文件float MyNameSpace::c = 3.0;中定义该变量。无论如何,这看起来并不像一条路,你不需要这里的外部人。

+0

如果我删除了extern关键字,并在我的cpp中将它重新定义为'double MyNameSpace :: c = 3.0',它给了我错误'变量MyNameSpace :: c无法在当前作用域中定义。所以,你的方法似乎并不为我工作... – Marijn

+1

如果您删除的extern你不需要去指定的类型,只是使用了myNameSpace :: C = 3.0 – Sergi0

+0

@ Sergi0:如果您删除'extern',那么你如果标题包含在多个翻译单元中,将打破One Definition Rule。 –

0

当使用extern关键字,应用于一个变量时,它声明一个变量,但它不会定义它。简而言之,目前为此变量没有分配内存;只声明变量c的定义是float。我最好的建议是在代码中定义的变量c某处d为默认值(也就是说,如果你真的需要extern在你的程序的体系结构)。

0

你不想分配它们;你想要定义它们。

// MyProject.cpp 
double MyNameSpace::c = 3.0; 
int MyNameSpace::d = 4; 

取决于如何使用它们,您可能还需要定义ab。由于它们是const,因此可以从声明中删除extern以将它们定义为静态变量;或者您可以单独保留extern声明并将不带初始程序的定义添加到cpp文件中。