-1

下面的代码给出了编译错误

namespace X{
  int i;
}

void f(){

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

}

但是如果我用 using namespace 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 ?
}

感谢您帮助我理解这一点。

4

3 回答 3

2

main()

using namespace X;
i = 10;

这设置X::i为 10。

打印 10 为什么?

这就是^^为什么。

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

于 2013-03-17T21:30:15.813 回答
1

当您说“使用命名空间 X”时...

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

在 f()...

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

在第一个示例中,当您说使用 X::i 时,您并没有给编译器太多选择。你在说<我想打电话给 X::i 'i' >。但是,它不能这样做——因为已经定义了一个“i”。强制编译器这样做会导致两个不同的变量具有相同的名称——这是不可能发生的。

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

于 2013-03-17T21:37:03.230 回答
0

using X::i声明将特定名称引入范围。显然,该名称i已被使用,因此您将无法再次使用它。
实际上,命名空间用于避免可能的名称冲突。使用如此短的名称,命名空间实际上是多余的。

于 2013-03-17T21:30:38.037 回答