名称空间查询

时间:2013-03-17 21:26:02

标签: c++

以下代码给出了编译错误

namespace X{
  int i;
}

void f(){

  int i;
  using X::i;  //compile error 'i’ is already declared in this scope

}

但是如果我用命名空间X替换这一行,它编译得很好。 有人可以帮助理解差异。

同样在下面的修改后的代码中,我希望X :: I的输出在所有地方都是100,但事实并非如此。

可能是我误解了名称空间概念?

namespace X{
  int i;
}

void f(){
  int i=1;
  cout << "local I " << i << endl;  // prints 1 OK
  using namespace X;
  i=100;
  cout << "X::i " << i << endl;   // prints 100 OK. 
  cout << "X::i " << X::i << endl; // prints 10 why ?
}

main(){
  using namespace X;
  i=10;
  f();
  cout << "X::i " << i << endl; //prints 10 why ?
}

感谢任何帮助让我理解这一点。

3 个答案:

答案 0 :(得分:2)

main()

using namespace X;
i = 10;

这会将X::i设置为10。

  

打印10个为什么?

那是^^为什么。

此外,在f()中:您有另一个名为i的局部变量阴影 X::i,这就是i解析为1和100的原因,分别只能通过显式指定其名称空间来访问X命名空间中的另一个变量。

答案 1 :(得分:1)

当你说'使用命名空间X'时......

如果变量'i'在X中定义,则对于变量'i'的所有引用,编译器将其替换为'X :: i'。所以在main()中,当你说i = 10时,它将X :: i设置为10。

在f()...

你创建了一个名为i的新变量。这与X :: i不同。你将我设置为1.然后,你开始使用命名空间X.但是,有一个命名冲突 - 当你说'我'时,它应该使用本地'i',还是X :: i? C ++编译器通过使用LOCAL i识别变量'i'来处理这种情况。因为在函数中已经定义了i,所以它不能在命名空间中引入另一个i - i。所以,为了引用X :: i,你必须明确地说'X :: i'。否则它认为你在谈论LOCAL i。

在第一个例子中,当你说使用X :: i时,你并没有给编译器多少选择。你在说&lt;我想打电话给X ::我'我&gt;。但是,它不能这样做 - 因为已经定义了'i'。强制编译器执行此操作将导致两个具有相同名称的不同变量 - 这是不可能发生的。

希望这澄清了一些事情。评论其他问题。

答案 2 :(得分:0)

using X::i语句在范围中引入了特定名称。显然,名称i已经被使用,因此您将无法再次使用它 实际上,命名空间用于避免可能的名称冲突。如此短的名称,命名空间实际上是矫枉过正。