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

时间:2013-05-27 15:29:33

标签: c++ namespaces scope

当我在下面的代码片段中运行时,输出 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. 使用命名空间的目的是什么?

3 个答案:

答案 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,它将按预期工作...