编写“:: namespace :: identifier”和“namespace :: identifier”有什么区别?

时间:2011-11-27 01:57:20

标签: c++ namespaces nested

我在代码中看到了这两种方法。你能解释两者之间有什么区别吗?我认为它与C ++完成名称空间查找的方式有关,你是否可以提供一些关于此的信息,或者可能是一个好的doc的链接?感谢。

2 个答案:

答案 0 :(得分:12)

示例:

#include <cstdio>

namespace x {
    const int i = 1;
}

namespace y {
    namespace x {
        const int i = 2;
    }

    void func()
    {
        std::printf("x::i = %d\n", x::i);
        std::printf("::x::i = %d\n", ::x::i);
    }
}

int main()
{
    y::func();
    return 0;
}

<强>输出:

x::i = 2
::x::i = 1

<强>解释

  • 当您引用x::i之类的标识符时,使用的定义是“最接近的”x::i。在::y::func内,定义::y::x::i比定义::x::i更接近。相比之下,没有这样的函数::y::std::printf因此使用::std::printf

  • 当您引用::x::i之类的标识符时,不存在歧义:它会查找名为x的顶级命名空间,然后在其中找到i

因此,在开头使用::可以拼写全局内容的全名。这也允许您区分本地变量和全局变量。

示例2:

#include <cstdio>
const int x = 5;
int main()
{
    const int x = 7;
    std::printf("x = %d\n", x);
    std::printf("::x = %d\n", ::x);
    return 0;
}

<强>输出:

x = 7
::x = 5

答案 1 :(得分:5)

这并不重要,至少在大多数时候都没有。

::identifier1::identifier2格式中,前面的冒号表示要查看identifier1的全局范围,然后在该范围内查找identifier2

identifier1::identifier2格式中,我们会查看identifier1当前范围。如果我们找不到它,则搜索父作用域,依此类推,直到找到它为止。然后,我们在刚刚找到的任何范围内搜索identifier2

如果您已经处于全球范围,那么无关紧要。但是,当您在一个名称空间或具有嵌套在其中的其他名称空间或类的类中工作时,该故事会发生变化。