首页 > 解决方案 > 与 main 中的变量 decleare 和 namspace 中的一个 decleare 没有冲突

问题描述

我正在研究 c++ 命名空间,并编写了一个简单的代码来理解它。特别是我制作了这段代码,我不明白为什么它没有给我编译器错误,我已经清除了变量'a'。编译器是否以某种方式帮助我?

#include<iostream>
using namespace std;
namespace funzioni_e_altro
{
    int a=5;
    int b=20;
    int c=10;
}
int main()
{
    using namespace funzioni_e_altro;
    int a=0;
    cout<<funzioni_e_altro::a<<"\n";
    cout<<b<<"\n";
    cout<<a<<"\n";
 return 0;
}

我希望它给了我一个编译器错误,但它给了我输出:
5
20
0

标签: c++namespaces

解决方案


using 指令使命名空间中的名称可用于非限定名称查找。但它不会在块中引入任何新的声明。当您在其中声明a时,main隐藏了 using 指令可能引入的名称。a在内部的非限定名称查找期间不再考虑这一点main

所以在写a的时候main,只能引用局部变量。就好像在main.

这种行为是有意的。它可以防止发生完全的混乱。如果需要, using 指令不应阻止代码在其自己的范围内声明名称。并且您可以始终通过完全限定其名称来引用命名空间中的变量。


推荐阅读