11

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

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

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

1 回答 1

4

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

§3.5/3:

具有命名空间范围 (3.3.6) 的名称如果是以下名称,则具有内部链接:
— 显式声明为静态的变量、函数或函数模板;

§3.5/4:

[...] 未命名命名空间或在未命名命名空间中直接或间接声明的命名空间具有内部链接。[...] 具有命名空间范围但没有在上面给出内部链接的名称,如果它是
一个变量的名称,则它与封闭命名空间具有相同的链接;或者
——一个函数;或者

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

请注意,我在这里专门针对一个函数进行回复——在一些晦涩的情况下,当您处理类型的名称(例如,类/结构/联合)时会有所不同,但我不知道适用于函数的任何此类事情。

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

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

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

于 2012-12-02T21:19:22.877 回答