命名空间查询

问题描述:

下面的代码给编译错误命名空间查询

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命名空间中的其他变量。

+0

但不会在函数f()中设置X :: i为100的语句i = 100? – irappa 2013-03-17 21:32:02

+1

@irappa在答案的最后一段中对此进行了解释。 – us2012 2013-03-17 21:32:32

+0

@irappa不,因为局部变量会影响全局变量,这就是我刚刚解释的** – 2013-03-17 21:32:40

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'>。但是,它不能这样做 - 因为已经定义了“我”。强制编译器这样做会导致两个具有相同名称的变量 - 这是不可能发生的。

希望这可以澄清一些事情。附加问题评论。

+0

谢谢,这清除了我的怀疑。 – irappa 2013-03-17 21:40:50

+0

所以你可以认为irappa关于接受他的回答或upvote至少 – 4pie0 2013-03-17 21:46:48

+0

@ cf16 - 你在跟我说话还是irappa? – Phynix 2013-03-18 00:25:02