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

Dan*_*tor 4 c++ nested namespaces

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

Die*_*Epp 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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

x = 7
::x = 5

  • @SethCarnegie:Ken Wayne VanderLinde似乎已经掌握了那种特殊艺术(见他的金徽章). (2认同)

Ken*_*nde 5

它并不重要,至少在大多数情况下并不重要.

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

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

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