静态和匿名命名空间

Static and anonymous namespace

本文关键字:命名空间 静态      更新时间:2023-10-16

可能重复:
未命名/匿名命名空间与静态函数

这是完全多余的吗,还是有理由这样做?

namespace {
static void f() {
...
}
}

对我来说,它看起来是多余的——要么被声明为静态,要么在匿名命名空间中,这意味着它有内部链接。

§3.5/3:

如果名称空间作用域(3.3.6)是以下项的名称,则该名称具有内部链接:
-显式声明为静态的变量、函数或函数模板;

§3.5/4:

[…]未命名命名空间或在未命名命名空间中直接或间接声明的命名空间具有内部链接。[…]名称空间作用域没有如果是变量
的名称,则上面给定的内部链接与封闭命名空间具有相同的链接;或
-一个函数;或

因此,正如现在一样,它具有内部链接,因为它被明确声明为静态。如果它没有明确声明为静态,那么它将具有内部链接,因为它是在未命名的命名空间中声明的。无论哪种方式,效果都一样。

请注意,我在这里专门回答一个函数——在处理类型名称(例如,类/结构/联合)时,有一些模糊的情况是有区别的,但我不知道有什么适用于函数的情况。

就内部联系的真正含义而言,这是标准非常直接和明确的地方之一。最好引用所有三种可能性的定义(§3.5/2):

  1. 当一个名称具有外部链接时,它所表示的实体可以由其他翻译单元的作用域或同一翻译单元的其他作用域的名称引用
  2. 当一个名称具有内部链接时,它所表示的实体可以由同一翻译单元中其他作用域的名称引用
  3. 当一个名称没有链接时,它所表示的实体不能被其他作用域的名称引用

请注意,上面的斜体字与标准中的斜体字相匹配,这就是它的说法,即这些句子定义了这些短语在标准其余部分的含义。