提问人:jaylse2 提问时间:10/19/2021 最后编辑:Vlad from Moscowjaylse2 更新时间:10/19/2021 访问量:101
关于 c++ 中命名空间的极其基本的问题
Extremely basic question about namespaces in c++
问:
using namespace X;
cout << var;
using Y::var;
cout << var;
假设我有一个命名空间 X 和一个命名空间 Y,它们都包含一个名为 var 的 int 类型的变量。当我说我想象发生的事情是,如果我使用一些不在全局名称范围内的变量,基本上发生的事情是,它没问题,我要寻找 var,但现在我也使用,这到底是什么意思?那只是说 var 和 Y::var 一样吗?但是,在这种情况下,发生了什么,它甚至不在那里寻找 var,因为我说我正在使用?using namespace X;
namespace X
Y::var
using namespace X
Y::var
答:
在 using 指令之后
using namespace X;
编译器使用非限定名称查找来查找以下语句中使用的名称var
cout << var;
由于 using 指令,它将在命名空间中找到变量。var
X
This using 声明
using Y::var;
引入当前作用域和下一个语句中的命名空间中的变量var
Y
cout << var;
将使用命名空间中的变量。var
Y
这是一个演示程序。
#include <iostream>
namespace X
{
int var = 1;
}
namespace Y
{
int var = 2;
}
int main()
{
using namespace X;
std::cout << "var = " << var << '\n';
using Y::var;
std::cout << "var = " << var << '\n';
}
程序输出为
var = 1
var = 2
也就是说,在函数 main 的块作用域中引入变量的 using 声明隐藏了在命名空间中声明的变量的声明。var
var
X
事实上,下面简化的演示程序本质上与上述程序在名称查找方面的行为类似。
#include <iostream>
int var = 1;
int main()
{
std::cout << "var = " << var << '\n';
int var = 2;
std::cout << "var = " << var << '\n';
}
是的,当你要求时会隐藏。前者是在此范围内声明的,后者仅影响不合格的查找。using Y::var;
X::var
var
Y::var
using ns_name::name;
using-declaration:使命名空间中的符号可供非限定查找访问,就像在与此 using 声明出现的位置相同的类作用域、块作用域或命名空间中声明一样。
name
ns_name
通过 using 声明引入命名空间范围的名称可以像使用任何其他名称一样使用,包括来自其他范围的限定查找
using namespace ns_name;
using-directive:从对 using 指令之后的任何名称进行非限定名称查找的角度来看,直到它出现的范围结束,每个名称都是可见的,就好像它是在最近的封闭命名空间中声明的一样,该命名空间同时包含 using 指令和 .
ns_name
ns_name
评论
X::var
X