以下代码给出了编译错误
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 ?
}
感谢任何帮助让我理解这一点。
答案 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
已经被使用,因此您将无法再次使用它
实际上,命名空间用于避免可能的名称冲突。如此短的名称,命名空间实际上是矫枉过正。