理解c++中的命名空间作用域
Understanding namespace scope in c++
当我运行下面的代码片段时,输出是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,它会像预期的那样工作…
相关文章:
- 作用域中定义的变量与注入该作用域的命名空间变量
- 主线程中块作用域static与命名空间作用域thread_local的初始化和销毁顺序
- 类与命名空间作用域
- 如何使用模板函数C++ 11 的 using 关键字来删除作用域中的命名空间
- c++中的匿名命名空间和匿名作用域之间有什么区别
- 从类方法返回作用域枚举时,命名空间混淆
- 全局作用域中匿名命名空间中的Can名称具有前导下划线
- 理解c++中的命名空间作用域
- 是一个命名空间,与c++中的作用域相同
- 命名空间作用域变量的c++初始化
- 内部结构在非命名空间作用域中的显式专用化
- 命名空间作用域vs类内部作用域
- 用于c++ 11的Vim语法高亮显示不会混淆其他高亮显示.例如,类/命名空间作用域
- 全局作用域枚举和命名空间冲突
- 命名空间的作用域
- 名称空间作用域构造函数定义是否需要类限定的标识符
- C++整个类作用域中的命名空间别名
- 命名空间作用域中的操作符在全局作用域中隐藏另一个操作符
- 命名空间作用域中的内联函数和类作用域中的静态函数
- 命名空间作用域问题