9

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

4

1 回答 1

11

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

例如:

// file1.cpp

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

#include "bar.h"

int do_stuff()
{
    foo();
    bar();
    return 5;
}

// file2.cpp

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

#include "bar.h"

int do_something else()
{
    bar();
    foo();
    return 12;
}

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

从技术上讲,您可以将未命名的命名空间想象成这样:

namespace unique_and_unknowable_name
{
    // ...
}

using namespace unique_and_unknowable_name;

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

于 2013-08-14T19:25:25.893 回答