Unnamed/anonymous namespaces vs. static functions未命名/匿名命名空间 vs 静态函数

24 浏览
0 Comments

Unnamed/anonymous namespaces vs. static functions未命名/匿名命名空间 vs 静态函数

C++的一项特性是能够创建无名(匿名)命名空间,像这样:

namespace {
    int cannotAccessOutsideThisFile() { ... }
} // namespace

你可能会认为这样的功能是无用的 - 由于无法指定命名空间的名称,因此无法从外部访问其中的任何内容。但是,在创建它们的文件中,这些无名命名空间可以像隐式使用它们一样被访问。

我的问题是,为什么或何时使用这种方法比使用静态函数更可取?或者它们本质上是使用完全相同的方法?

admin 更改状态以发布 2023年5月22日
0
0 Comments

将方法放在匿名命名空间中可以防止意外违反一定义规则,使您不必担心将您的助手方法命名为您可能链接到的其他方法相同的名称。

而且,正如luke指出的那样,匿名命名空间优先于静态成员。

0
0 Comments

C++标准在第7.3.1.1节未命名的命名空间的第2段中写道:

声明位于命名空间范畴内的对象时,static关键字的使用已过时,未命名命名空间提供了一种更好的替代方法。

static关键字只适用于对象、函数和匿名联合体的名称,而非类型声明。

编辑:

严格控制使用static关键字(影响翻译单元中变量声明的可见性)的决策已被撤销(参见)。在这种情况下,使用static或无名namespace都是基本相同的两种方法。更多讨论请参见这个SO问题。

未命名的namespace仍然具有允许定义翻译单元本地类型的优势。有关详细信息,请参见这个SO问题。

Mike Percy在此处提到,对此表示感谢。

0