首页 文章

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

提问于
浏览
80

这个问题在这里已有答案:

C标准的第7.3.1.1 / 2节内容如下:

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

很长一段时间我都不知道标准是什么,但即使我回答这个问题,我也从未认真考虑过这个问题:Superiority of unnamed namespace over static?

它被认为是优越的,因为它也可以应用于用户定义的类型,正如我在_2560790中描述的那样?或者还有其他一些原因,我问这个问题,特别是因为这是我在答案中的推理,而标准可能会考虑其他因素 .

4 回答

  • 88
    • 正如您所提到的,命名空间适用于任何事物,而不仅仅适用于函数和对象 .

    • 正如格雷格指出的那样, static 已经意味着太多东西了 .

    • 命名空间提供统一且一致的方法来控制全局范围内的可见性 . 您不必为同一件事使用不同的工具 .

    • 当使用匿名命名空间时,函数/对象名称将被正确地破坏,这允许您在去除变形后在符号表中看到类似"(anonymous namespace)::xyz"的内容,而不仅仅是带有静态链接的"xyz" .

    • 正如下面的评论所指出的,它不是很好 .

    • 更多?可能,但我现在想不出任何其他事情 .

  • 6

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

  • 3

    我认为有两个原因:

    • static 有两个不同的含义:在类范围,它意味着整个类共享,而在文件/功能范围它影响可见性/存储...

    • 未命名的命名空间允许声明新的 structclasstypedef

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

  • 9

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

相关问题