105

C++ 标准中的 $7.3.1.1/2 部分内容如下:

在命名空间范围内声明对象时,不推荐使用 static 关键字;unnamed-namespace 提供了一个更好的选择。

我不明白为什么一个未命名的命名空间被认为是一个更好的选择?理由是什么?我很早就知道该标准的内容,但我从未认真考虑过它,即使我在回答这个问题时也是如此:未命名命名空间优于静态?

正如我在回答中所描述的,它是否被认为是优越的,因为它也可以应用于用户定义的类型?还是还有其他一些我不知道的原因?我问这个,特别是因为这是我在回答中的推理,而标准可能还有其他考虑。

4

3 回答 3

117
  • 正如您所提到的,命名空间适用于任何事物,而不仅仅是函数和对象。
  • 正如格雷格指出的那样,static已经意味着太多的东西。
  • 命名空间提供了一种统一且一致的方式来控制全局范围内的可见性。您不必为同一件事使用不同的工具。
  • 使用匿名命名空间时,函数/对象名称将被正确修改,这使您可以在 de-mangling 后在符号表中看到类似“(anonymous namespace)::xyz”的内容,而不仅仅是带有静态链接的“xyz” .
  • 正如下面的评论中所指出的,不允许使用静态的东西作为模板参数,而使用匿名命名空间就可以了。
  • 更多的?可能吧,但我现在想不出别的了。
于 2011-02-12T10:22:18.113 回答
9

一个原因可能是它static已经有太多的含义(我至少可以数出三个)。由于匿名命名空间可以封装包括类型在内的任何内容,因此它似乎优于static解决方案。

于 2011-02-12T09:10:18.330 回答
6

我认为有两个原因:

  • static有两个不同的含义:在类范围内,它意味着由整个类共享,而在文件/函数范围内,它会影响可见性/存储...
  • 未命名的命名空间允许声明 newstructclasstypedef

不过,有一点需要注意,委员会对此表示反对:static不再在n3225.

于 2011-02-12T10:23:57.423 回答