【发布时间】:2013-08-16 21:39:12
【问题描述】:
使用未命名的命名空间和全局声明有什么区别?
使用这两者有什么特定的上下文吗?
我们可以访问外部源文件中未命名的命名空间组件吗?
【问题讨论】:
-
“全局”我猜你的意思是
const statics?
标签: c++ namespaces declaration globals unnamed-namespace
使用未命名的命名空间和全局声明有什么区别?
使用这两者有什么特定的上下文吗?
我们可以访问外部源文件中未命名的命名空间组件吗?
【问题讨论】:
const statics?
标签: c++ namespaces declaration globals unnamed-namespace
未命名命名空间的意义在于在翻译单元(= 源文件)内提供唯一的命名空间,而不需要显式前缀。这允许您保证您的全局名称不会与其他翻译单元中的其他相同的全局名称发生冲突。
例如:
// 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 会影响链接,而命名空间则不会。
【讨论】:
static 会影响链接,而命名空间不会。”这种差异意味着什么?
static函数有内部链接;否则它有外部链接。因此,未命名命名空间中的函数具有外部链接,只是名称不可知。