C++ 的一个特性是能够创建未命名(匿名)命名空间,如下所示:
namespace {
int cannotAccessOutsideThisFile() { ... }
} // namespace
你会认为这样的特性是没有用的——因为你不能指定命名空间的名称,所以不可能从外部访问其中的任何内容。但是这些未命名 的命名空间可以在创建它们的文件中 访问,就好像你对它们有一个隐含的 using 子句一样。
我的问题是,为什么或什么时候这比使用静态函数更可取?或者他们本质上是做同样事情的两种方式?
原文由 Head Geek 发布,翻译遵循 CC BY-SA 4.0 许可协议
C++ 标准在第 7.3.1.1 节未命名命名空间,第 2 段中写道:
静态仅适用于对象、函数和匿名联合的名称,不适用于类型声明。
编辑:
弃用
static
关键字(影响翻译单元中变量声明的可见性)的决定已被撤销( ref )。在这种情况下,使用static
或未命名的namespace
基本上是两种做同样事情的方法。有关更多讨论,请参阅 此 SO question。未命名的
namespace
仍然具有允许您定义翻译单元本地类型的优势。有关更多详细信息,请参阅 此 SO 问题。感谢 Mike Percy 让我注意到了这一点。