使用未命名名称空间和全局声明有什么区别
使用这两个词有什么具体的上下文吗
我们可以访问外部源文件中未命名的命名空间组件吗?
未命名名称空间的目的是在翻译单元(=源文件)中提供唯一的名称空间,而不需要显式前缀。这允许您保证您的全局名称不会与其他翻译单位中的其他相同全局名称发生冲突。
例如:
// 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
会影响链接,而命名空间则不会。
在未命名命名空间内声明的所有名称都具有内部链接(甚至是使用外部说明符定义的名称)。