当我在下面的代码片段中运行时,输出 a是6 。但由于我使用了命名空间n1,它也有名称“a”的变量,因此输出不应该是 a是5 。我错过了什么吗?
#include <iostream>
using namespace std;
namespace n1{
int a = 5;
}
int main(void){
int a = 6;
using namespace n1;
cout<<"a is "<<a<<endl;
return 0;
}
但如果我在cout中使用完全限定名,即cout&lt;&lt;“a is”&lt;&lt; n1 :: a ;输出是预期的,即5. 使用命名空间的目的是什么?
答案 0 :(得分:2)
规则很简单:
“局部变量始终隐藏/隐藏其他名称空间中的变量或具有相同名称的全局变量。”
在声明局部变量a
的范围内,using指令对符号名a
没有影响。它仍会在当前范围内导入名称空间n1
中的所有符号名称,但局部变量a
仍然隐藏n1::a
。因此,n1::a
根本不可见,您需要使用完全限定名称。
答案 1 :(得分:2)
using
指令是编译器提示应搜索名称a
的地方的提示。
这样,名称查找将按以下顺序完成:
a
a
,请在名称空间n1
a
,请查看全局命名空间如果没有您提供的using
指令,则不会执行第二步。
在你的情况下,因为实际上有一个名为a
的变量(但它可能是任何东西,我们所说的是名称),它不会再进一步了。 / p>
答案 2 :(得分:1)
当一个变量在本地命名空间中定义时(在main中是在你的本地命名空间中),它会更喜欢它。
所以在这种情况下你必须告诉它(我想要来自n1名称空间n1 :: a) 如果删除a,它将按预期工作...