这个问题在这里已有答案:
C标准的第7.3.1.1 / 2节内容如下:
在命名空间作用域中声明对象时,不推荐使用static关键字; unnamed-namespace提供了一个更好的选择 .
很长一段时间我都不知道标准是什么,但即使我回答这个问题,我也从未认真考虑过这个问题:Superiority of unnamed namespace over static?
它被认为是优越的,因为它也可以应用于用户定义的类型,正如我在_2560790中描述的那样?或者还有其他一些原因,我问这个问题,特别是因为这是我在答案中的推理,而标准可能会考虑其他因素 .
4 回答
正如您所提到的,命名空间适用于任何事物,而不仅仅适用于函数和对象 .
正如格雷格指出的那样,
static
已经意味着太多东西了 .命名空间提供统一且一致的方法来控制全局范围内的可见性 . 您不必为同一件事使用不同的工具 .
当使用匿名命名空间时,函数/对象名称将被正确地破坏,这允许您在去除变形后在符号表中看到类似"(anonymous namespace)::xyz"的内容,而不仅仅是带有静态链接的"xyz" .
正如下面的评论所指出的,它不是很好 .
更多?可能,但我现在想不出任何其他事情 .
一个原因可能是
static
已经有太多的含义(我至少可以算三个) . 由于匿名命名空间可以封装包括类型在内的任何内容,因此它似乎优于static
解决方案 .我认为有两个原因:
static
有两个不同的含义:在类范围,它意味着整个类共享,而在文件/功能范围它影响可见性/存储...未命名的命名空间允许声明新的
struct
,class
和typedef
但需要注意的是,委员会对此进行了后退:
static
在n3225
中不再被标记为已弃用 .无论他们有什么理由,他们改变了主意:http://crazycpp.wordpress.com/2011/01/18/static-keyword-is-back/