【发布时间】:2011-05-29 16:17:29
【问题描述】:
我长期以来一直使用static 关键字来定义内部链接。后来,我改用 C++ 风格,将本地事物包装在匿名命名空间中。
然而,当我使用匿名命名空间多年后,我开始认为static 关键字更容易使用!
一个常见的问题是我有这个模式:
namespace {
// ...five pages of code...
} // namespace
要查看某个函数是否具有内部或外部链接,我现在必须滚动很多次,而不是旧的 C 样式,我可以只检查函数/对象前面是否有 static。
我知道匿名命名空间有一些 static 无法做到的事情 - 隐藏 typedef - 但我个人对此并不是很感兴趣。
您对此有何看法?匿名命名空间的胜利是否会降低可读性?还是我都错了?
【问题讨论】:
-
static命名空间范围内的函数已被弃用,这是不使用它们的充分理由。 anon 命名空间中的函数具有static的所有优点,除了它们具有外部链接。我认为后者已经由编译器处理,从导出的部分中删除匿名命名空间中定义的名称。 -
@Gene 实际上,静态函数从未被弃用。弃用仅针对objects。但是,在 n3225 中删除了弃用:在 C++0x 中,不再建议使用它来提供对象或函数内部链接。另一个区别是未命名的命名空间将保留外部链接:未命名的命名空间及其内容将在 C++0x 中获得内部链接。所以静态方式和命名空间方式之间似乎没有任何区别,除了命名空间方式将允许像
namespace { int a; } int a;这样的东西。 -
@Johannes:C++0x 是否允许带有内部链接的模板参数,或者这是一个巨大的突破性变化?
-
@Steve 是的,它允许模板参数具有内部链接。
标签: c++ static namespaces