使用名称空间的行为究竟如何
How do using namespace behave exactly?
例如,我们有这样的程序:
#include <iostream>
namespace a
{
namespace b
{
namespace c
{
int alpha = 5;
}
}
}
int main()
{
using namespace a;
using namespace b;
using namespace c;
std::cout << alpha;
return 0;
}
在成功编译之后,我认为使用名称空间的行为类似于unix cd
。在代码的第一行,我们位于根::
,然后转到::a
、::a::b
、::a::b::c
。但在这样的修改和成功运行后,我惊呆了:
int main()
{
using namespace a;
using namespace b;
using namespace c;
using namespace b;
std::cout << alpha;
return 0;
}
它仍然有效,我们都不在"b目录"中!
即使是这样的结构也是允许的…:
namespace a
{
namespace b
{
namespace c
{
int alpha = 5;
}
}
}
namespace b
{
namespace a
{
}
}
void main()
{
using namespace a;
}
请解释一下,使用名称空间行为!
编写using namespace x;
只会将x
中的所有名称带入当前范围。x
内部的名称可能包括其他名称空间的名称。
举第一个例子:
#include <iostream>
namespace a
{
namespace b
{
namespace c
{
int alpha = 5;
}
}
}
int main()
{
using namespace a;
using namespace b;
using namespace c;
std::cout << alpha;
return 0;
}
首先,using namespace a;
使名称b
在main
内可用。这允许我们执行using namespace b;
,这还使得名称c
在main
中可用。最后,我们可以执行using namespace c;
以使名称alpha
可用。
现在你的第二个例子:
int main()
{
using namespace a;
using namespace b;
using namespace c;
using namespace b;
std::cout << alpha;
return 0;
}
前三行和前面一样,将名称b
、c
和alpha
纳入范围。最后,重复using namespace b;
没有任何效果,因为我们已经将b
中的所有名称都纳入了作用域。此外,alpha
已经进入范围,因此在下一行中仍然可用。最终的using namespace b;
并没有以某种方式消除这一点。
使用命名空间可以有效地打开其内容。这就是为什么"使用命名空间std;"允许您使用不带std::前缀的"cout"。与其更改目录,不如将名称空间的内容移动到当前目录中。
相关文章:
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 通过继承类使用来自不同命名空间的运算符
- 使用命名空间时出现多个定义错误
- OpenGL相机和相机空间转型的困惑
- CUDA内核和数学函数的显式命名空间
- 传递给std::function template的template参数究竟代表什么
- 打印第二列时的2d字符矢量打印空间
- 嵌套的匿名命名空间
- CMakeLists.txt中的命名空间表示法
- 类是C++中的命名空间吗
- 在命名空间中使用全局命名空间中的函数
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- '使用命名空间{嵌套在另一个命名空间中的某个命名空间}"
- 为什么 openmp 的并行不适用于矢量化色彩空间转换?
- 使用名称空间的行为究竟如何