我正在研究 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
最佳答案
using 指令使命名空间中的名称可用于非限定名称查找。但它不会在 block 中引入任何新的声明。当您在 main
中声明 a
时,它会隐藏 using 指令可能引入的名称。该 a
不是在 main
内进行非限定名称查找时不再考虑。
所以当你在main
中写a
时,它只能引用局部变量。就好像 main
中根本不存在 using 指令一样。
此行为是有意为之。它可以防止完全困惑的发生。如果需要,using 指令不应阻止代码在其自己的作用域中声明名称。并且您始终可以通过完全限定其名称来引用命名空间中的变量。
关于c++ - 与mind中的变量decleare和命名空间中的声明不冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56092705/