nit*_*112 5 c++ scope namespaces
当我运行下面的代码片段时,输出是a is 6。但由于我使用了命名空间 n1,它也有名为“a”的变量,所以输出不应该是a is 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;
}
Run Code Online (Sandbox Code Playgroud)
但如果我在 cout 中使用完全限定名称,即 cout<<"a is "<< n1::a ; 输出符合预期,即 5.使用命名空间的目的是什么?
该using指令向编译器提示应在何处搜索名称a。
这样,名称查找将按以下顺序完成:
a首先在本地范围内a没有找到,则在命名空间中搜索n1a找到,就到全局命名空间中查找如果没有using您提供的指令,则不会执行第二步。
在您的情况下,由于实际上有一个名为 name 的变量(但它可以是任何东西,我们正在谈论名称)a,因此它不会再进一步。
规则很简单:
“局部变量总是隐藏/隐藏其他名称空间中的变量或同名的全局变量。”
在声明局部变量的范围内a,using 指令对符号名称没有影响a。它仍然从当前范围内的命名空间导入所有符号名称n1,但局部变量a仍然隐藏n1::a。所以n1::a根本不可见,您需要使用它的完全限定名称。