理解c++中的命名空间作用域

Understanding namespace scope in c++

本文关键字:命名空间 作用域 c++ 理解      更新时间:2023-10-16

当我运行下面的代码片段时,输出是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<<"a is "<<n1::a;输出如预期的5。使用命名空间的目的是什么?

using指令提示编译器应该在哪里搜索名称a

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

  • 首次在本地范围内查找a
  • 如果没有找到a,在命名空间n1
  • 中搜索
  • 如果仍然没有找到a,请查看全局命名空间

如果没有您提供的using指令,第二步将无法执行。

在您的例子中,由于实际上有一个名为a的变量(但它可以是任何东西,我们讨论的是名称),因此它没有进一步执行

规则很简单:
"局部变量总是遮蔽/隐藏其他命名空间中的变量或同名的全局变量。"

在声明局部变量a的作用域中,using指令对符号名a没有影响。它仍然从当前作用域中的命名空间n1导入所有的符号名,但是局部变量a仍然隐藏n1::a。所以n1::a是不可见的,你需要为它使用完全限定名。

当变量在本地命名空间中定义时(a in main在您的本地命名空间中),它将优先使用它。

所以在这种情况下,你必须告诉它(我想从n1命名空间n1::a)如果你去掉a,它会像预期的那样工作…