静态和匿名命名空间

时间:2012-12-02 21:08:33

标签: c++

  

可能重复:
  Unnamed/anonymous namespaces vs. static functions

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

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

1 个答案:

答案 0 :(得分:3)

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

§3.5/ 3:

  

具有命名空间范围(3.3.6)的名称具有内部链接,如果它的名称为:
   - 显式声明为static的变量,函数或函数模板;

§3.5/ 4:

  

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

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

请注意,这里我特意回复了一个函数 - 有一些很少的模糊的情况,当你处理一个类型的名称时会有区别(例如,类/结构) / union),但我不知道任何适用于函数的东西。

就内部联系的真正含义而言,标准实际上非常直接和清晰。最好引用所有三种可能性的定义(§3.5/ 2):

  1. 当名称具有外部链接时,其表示的实体可以通过其他翻译单位的范围或同一翻译单位的其他范围中的名称来引用。
  2. 当名称具有内部链接时,其表示的实体可以通过同一翻译单元中其他范围的名称来引用。
  3. 如果名称中没有无链接,则表示的实体不能通过其他范围的名称引用。
  4. 请注意,上面的斜体符合标准中的斜体,这就是说这些句子定义了这些短语在标准的其余部分中的含义。