关于c ++:静态和匿名命名空间


Static and anonymous namespace

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Unnamed/anonymous namespaces vs. static functions

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

1
2
3
4
5
namespace {
  static void f() {
    ...
  }
}


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

3.3.5/3:

A name having namespace scope (3.3.6) has internal linkage if it is the name of:
— a variable, function or function template that is explicitly declared static;

3.3.5/4:

[...] An unnamed namespace or a namespace declared directly or indirectly within an unnamed namespace has internal linkage. [...] A name having namespace scope that has not
been given internal linkage above has the same linkage as the enclosing namespace if it is the name of
— a variable; or
— a function; or

所以,就像现在一样,它有内部链接,因为它被显式声明为静态的。如果不是显式声明为static,则它将具有内部链接,因为它是在未命名的命名空间中声明的。不管怎样,效果都一样。

注意,这里我专门回答一个函数——有一些模糊的情况,在处理一个类型的名称(例如,class/struct/union)时会有不同之处,但是我不知道在处理一个函数的情况时会有什么应用。

至于内部联系真正意味着什么,这是其中一个地方,标准实际上是非常直接和明确的。最好引用这三种可能性的定义(§3.5/2):

  • 当一个名称具有外部链接时,它所表示的实体可以由来自其他翻译单元范围的名称或来自同一翻译单元的其他范围的名称引用。
  • 当名称具有内部链接时,它表示的实体可以由同一翻译单元中其他作用域的名称引用。
  • 当一个名称没有链接时,它所表示的实体不能被来自其他作用域的名称引用。
  • 请注意,上面的斜体字与标准中的斜体字相匹配,也就是说,这些句子定义了标准其余部分中这些短语的含义。