为什么一个未命名的命名空间是静态的“优越”替代品?

时间:2011-02-12 09:04:18

标签: c++ namespaces standards iso

C ++标准中的$ 7.3.1.1 / 2部分为:

  

使用static关键字是   在声明对象时不推荐使用   名称范围; unnamed-namespace   提供更好的替代方案。

我不明白为什么一个未命名的命名空间被认为是一个更好的选择?理由是什么?很长一段时间我都知道标准说的是什么,但即使我回答这个问题,我也从未认真考虑过它:Superiority of unnamed namespace over static?

它是否被认为是优越的,因为它也可以应用于用户定义的类型,正如我在answer中描述的那样?还是有其他原因,我不知道?我问这个问题,特别是因为这是我在答案中的推理,而标准可能会有其他想法。

4 个答案:

答案 0 :(得分:89)

  • 正如您所提到的,命名空间适用于任何事物,而不仅仅适用于函数和对象。
  • 正如格雷格指出的那样,static已经意味着很多东西。
  • 命名空间提供统一且一致的方法来控制全局范围内的可见性。您不必为同一件事使用不同的工具。
  • 当使用匿名命名空间时,函数/对象名称将被正确地破坏,这允许您在去除变形后在符号表中看到类似“(anonymous namespace):: xyz”的内容,而不仅仅是“xyz”与静态联系。
  • 正如下面的评论中指出的那样,不允许使用静态内容作为模板参数,而使用匿名名称空间则没有问题。
  • 更多?可能,但我现在想不出别的什么。

答案 1 :(得分:9)

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

答案 2 :(得分:6)

我认为有两个原因:

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

但需要注意的是,委员会对此进行了后退:static不再在n3225中标记为已弃用。

答案 3 :(得分:3)

无论他们有什么理由,他们都改变了主意:http://crazycpp.wordpress.com/2011/01/18/static-keyword-is-back/