我一直在使用 static
关键字来定义内部链接。后来,我改用 C++ 风格,将本地事物包装在匿名命名空间中。
然而,当我使用匿名命名空间多年后,我开始认为 static
关键字更容易使用!
一个常见的问题是我有这个模式:
namespace {
// ...five pages of code...
} // namespace
要查看某个函数是否具有内部或外部链接,我现在必须滚动很多次,而不是旧的 C 样式,我可以只检查函数/对象是否有 static
前面。
我知道匿名命名空间有一些 static
无法做到的事情 - 隐藏 typedef - 但我个人对此并不是很感兴趣。
您对此有何看法?匿名命名空间的胜利是否足以保证降低可读性?还是我都错了?
最佳答案
如果你的命名空间中的代码太长,没有什么可以阻止你这样做:
namespace {
int foo(char* x) {
return x[0] + x[1];
}
}
namespace {
int bar(char *x, char *y) {
return foo(x) + foo(y);
}
}
在 C++03 中,使用未命名命名空间的实际优势正是内容具有 external 链接(但在 TU 之外仍然不可见,因为无法引用它们)。模板参数不能有内部链接:
namespace {
int foo(const char* x) {
return x[0] + x[1];
}
}
static int foo2(const char *x) {
return x[0] + x[1];
}
template <int (*F)(const char*)>
void baz(const char *p) {
F(p);
}
int main() {
baz<foo>("ab"); // OK
baz<foo2>("ab"); // not valid
}
关于c++ - 匿名命名空间 : Are they really that great?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4514008/