c++ - 与 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
解决方案
using 指令使命名空间中的名称可用于非限定名称查找。但它不会在块中引入任何新的声明。当您在其中声明a
时,main
它隐藏了 using 指令可能引入的名称。a
在内部的非限定名称查找期间不再考虑这一点main
。
所以在写a
的时候main
,只能引用局部变量。就好像在main
.
这种行为是有意的。它可以防止发生完全的混乱。如果需要, using 指令不应阻止代码在其自己的范围内声明名称。并且您可以始终通过完全限定其名称来引用命名空间中的变量。
推荐阅读
- python - 高斯滤波器在直方图中创建孔
- python - 移除位置列中的坐标
- javascript - Django-channels:chatSocket.onmessage 或 chatSocket.send 不起作用
- c++ - 为什么我的神经网络在某个成本附近停滞不前?
- android - windowSoftInputMode="adjustPan|adjustResize" 不适用于坐标布局
- javascript - 文件名只能包含 ASCII 32-126 字符,一些特殊字符除外
- amazon-web-services - 是否可以在 AWS Neptune 上将 GeoSparql 与 GeoJSON 对象一起使用?
- apache-storm - 如何修复“无法从种子主机中找到领导灵气 [192.168.23.165]
- jquery - 如何在输入范围内禁用鼠标滚动
- swift - 将字符串转换为 URL(为什么结果变量为零)