C++ 的一个特性是能够创建未命名(匿名)命名空间,如下所示:
namespace { int cannotAccessOutsideThisFile() { ... } } // namespace
你会认为这样的特性是没有用的——因为你不能指定命名空间的名称,所以不可能从外部访问其中的任何内容。但是这些未命名 的命名空间可以在创建它们的文件中 访问,就好像您对它们有一个隐含的 using 子句一样。
我的问题是,为什么或什么时候这比使用静态函数更可取?或者他们本质上是做同样事情的两种方式?
C++ 标准在第 7.3.1.1 节未命名命名空间,第 2 段中写道: ~~~~
在命名空间范围内声明对象时,不推荐使用 static 关键字,未命名命名空间提供了更好的选择。
静态仅适用于对象、函数和匿名联合的名称,不适用于类型声明。
弃用关键字的这种使用static(影响翻译单元中变量声明的可见性)的决定已被撤销(ref)。在这种情况下,使用 astatic或 unnamednamespace本质上是两种做同样事情的方式。
static
namespace
Unnamednamespace仍然具有允许您定义翻译单元本地类型的优势。