未命名的命名空间Vs全局声明

Kau*_*hik 7 c++ namespaces declaration globals unnamed-namespace

使用未命名的命名空间和全局声明有什么区别?
使用这两个是否有任何特定的背景?
我们可以在外部源文件中访问未命名的命名空间组件吗?

Ker*_* SB 6

未命名的命名空间的要点是在翻译单元(=源文件)中提供唯一的命名空间,而不需要显式前缀.这使您可以保证您的全局名称不会与其他翻译单元中的其他相同全局名称冲突.

例如:

// file1.cpp

namespace
{
    void foo() { /* ... */ }
}

#include "bar.h"

int do_stuff()
{
    foo();
    bar();
    return 5;
}
Run Code Online (Sandbox Code Playgroud)

// file2.cpp

namespace
{
    void foo() { /* ... */ }
}

#include "bar.h"

int do_something else()
{
    bar();
    foo();
    return 12;
}
Run Code Online (Sandbox Code Playgroud)

您可以将这两个翻译单元链接在一起foo,并确切知道这两个名称将引用相应文件中定义的函数,并且您不违反单一定义规则.

从技术上讲,您可以将未命名的命名空间视为如下所示:

namespace unique_and_unknowable_name
{
    // ...
}

using namespace unique_and_unknowable_name;
Run Code Online (Sandbox Code Playgroud)

如果没有此工具,您可以保证不违反ODR的唯一方法是使用static声明.但是,有一个细微的差别,static影响链接,而命名空间则不然.