如何使用命名空间完全表现?

时间:2016-01-09 22:54:57

标签: c++ namespaces

例如我们有这个程序:

#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;
}

请使用命名空间行为解释一下!

2 个答案:

答案 0 :(得分:2)

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; cmain另外提供名称using namespace c;。最后,我们可以alpha使名称int main() { using namespace a; using namespace b; using namespace c; using namespace b; std::cout << alpha; return 0; } 可用。

现在是你的第二个例子:

b

前三行与以前一样,将名称calphausing namespace b;纳入范围。最后,重复b没有任何效果,因为我们已经将alpha中的所有名称都带入了范围。此外,using namespace b;已被纳入范围,因此仍可在下一行使用。最终的.java并没有以某种方式撤消这一点。

答案 1 :(得分:1)

使用命名空间有效地解包其内容。 这就是为什么“使用命名空间std;”允许你使用没有std ::前缀的“cout”。不要改变目录,而应将其视为将命名空间的内容移动到当前目录中。