使用名称空间的行为究竟如何

How do using namespace behave exactly?

本文关键字:究竟 空间      更新时间:2023-10-16

例如,我们有这样的程序:

#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;使名称bmain内可用。这允许我们执行using namespace b;,这还使得名称cmain中可用。最后,我们可以执行using namespace c;以使名称alpha可用。

现在你的第二个例子:

int main()
{
    using namespace a;
    using namespace b;
    using namespace c;
    using namespace b;
    std::cout << alpha;
    return 0;
}

前三行和前面一样,将名称bcalpha纳入范围。最后,重复using namespace b;没有任何效果,因为我们已经将b中的所有名称都纳入了作用域。此外,alpha已经进入范围,因此在下一行中仍然可用。最终的using namespace b;并没有以某种方式消除这一点。

使用命名空间可以有效地打开其内容。这就是为什么"使用命名空间std;"允许您使用不带std::前缀的"cout"。与其更改目录,不如将名称空间的内容移动到当前目录中。