如果我们没有为它明确声明命名空间名称,那么全局变量属于什么命名空间?

时间:2014-12-27 05:52:00

标签: c++ namespaces

最近我正在努力熟悉C ++。而且我对命名空间"有点困惑。东西。这是一个示例代码:

#include <iostream>
using namespace std;

namespace foo
{
  int value() { return 5; }
}

namespace bar
{
  const double pi = 3.1416;
  double value() { return 2*pi; }
}
int a; //what's the namespace it belongs to?
int main () {
  cout << foo::value() << '\n';
  cout << bar::value() << '\n';
  cout << bar::pi << '\n';
  return 0;
}

上面的代码显示了两个显式名称空间:foo和bar。而且它们的范围都有一些全局变量。我的问题是变量 a ,因为我们没有为它指定命名空间名称,它属于哪个命名空间(或匿名命名空间)?或者它没有要附加的命名空间?如果我想从其他文件中使用此变量 a ,我们如何指定其名称空间?

2 个答案:

答案 0 :(得分:2)

a位于global namespace scope。如果它没有被遮蔽,并且假设您已包含正确的头文件,则可以在其他文件中将其称为a。但是,如果它被遮蔽,或者您只是想安全地玩并且明确指出它,您可以将其称为::a

例如,

#include <header_for_a.h>

namespace B
{
 int a;//This now shadows the "a" from the global namespace.

 void foo()
 {
  a = 1;//This is referring to B::a;
  ::a = 2; // This is referring to "a" from the global namespace.
 } 
}

答案 1 :(得分:1)

int a

属于全局命名空间。这意味着全局命名空间中具有相同名称的另一个变量可能为您带来链接器错误。

如果我想从其他文件中使用此变量a,我们如何指定其名称空间?

您可以将其括在命名空间中。通常,命名空间应包含其中的所有相关实体。所以,如果您认为它可以放在已经存在的命名空间中,那么请设置go。