命名空间查询
下面的代码给编译错误命名空间查询
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 ?
}
感谢您的任何帮助,使我明白这一点。
在main()
:
using namespace X;
i = 10;
这台X::i
分至10
相片10为什么呢?
那就是^^
为什么。
此外,在f()
:你有另一个局部变量命名i
是阴影X::i
,这就是为什么i
分别解析为1到100,你只能通过明确指定其命名空间访问在X
命名空间中的其他变量。
using X::i
声明在范围中引入了一个特定名称。显然,名称i
已被使用,因此您将无法再使用它。
实际上,名称空间用于避免可能的名称冲突。用这样短的名字,命名空间实际上是矫枉过正的。
当你说“使用命名空间X” ......
如果变量“我”在X的定义,那么,对于给变量“我”的所有引用,编译器与“X替代它: :一世'。所以在main(),当你说I = 10,它的设置X ::我到10
在F()...
创建一个名为我的新变量。这与X :: i不同。您将i设为1.然后,您开始使用命名空间X.但是,有一个命名冲突 - 当您说'我'时,它应该使用本地'我'还是X :: i? C++编译器通过用LOCAL i识别变量'i'来处理这种情况。因为我已经定义了一个函数,所以它不能在命名空间中引入另一个i - 我。所以,为了引用X :: i,你必须明确地说'X :: i'。否则它认为你在谈论LOCAL i。
在第一个例子中,当你说使用X :: i时,你并没有给编译器很多选择。你在说<我想要打X :: i'i'>。但是,它不能这样做 - 因为已经定义了“我”。强制编译器这样做会导致两个具有相同名称的变量 - 这是不可能发生的。
希望这可以澄清一些事情。附加问题评论。
但不会在函数f()中设置X :: i为100的语句i = 100? – irappa 2013-03-17 21:32:02
@irappa在答案的最后一段中对此进行了解释。 – us2012 2013-03-17 21:32:32
@irappa不,因为局部变量会影响全局变量,这就是我刚刚解释的** – 2013-03-17 21:32:40