了解 C++ 中的命名空间范围

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.使用命名空间的目的是什么?

JBL*_*JBL 5

using指令向编译器提示应在何处搜索名称a

这样,名称查找将按以下顺序完成:

  • 首先搜索a首先在本地范围内
  • 如果a没有找到,则在命名空间中搜索n1
  • 如果还是没有a找到,就到全局命名空间中查找

如果没有using您提供的指令,则不会执行第二步。

在您的情况下,由于实际上有一个名为 name 的变量(但它可以是任何东西,我们正在谈论名称a,因此它不会再进一步​​。


Alo*_*ave 3

规则很简单:
“局部变量总是隐藏/隐藏其他名称空间中的变量或同名的全局变量。”

在声明局部变量的范围内a,using 指令对符号名称没有影响a。它仍然从当前范围内的命名空间导入所有符号名称n1,但局部变量a仍然隐藏n1::a。所以n1::a根本不可见,您需要使用它的完全限定名称。