Joh*_*ski 16 c++ static namespaces
我一直在使用static关键字来定义内部链接.后来,我转而采用C++方式在匿名命名空间中包装本地事物.
但是,现在当我使用匿名命名空间多年时,我开始认为static关键字更容易使用!
一个常见的问题是我有这种模式:
namespace {
// ...five pages of code...
} // namespace
Run Code Online (Sandbox Code Playgroud)
要查看某个函数是否具有内部或外部链接,我现在必须滚动很多,而不是旧的C样式,我可以检查函数/对象是否static在它前面.
我知道匿名命名空间有些东西static不能 - 隐藏typedef - 但不管怎样,我个人对此并不是很感兴趣.
你对此有何看法?匿名命名空间的胜利是否很好,它保证了可读性的降低?或者我都错了?
Ste*_*sop 20
如果命名空间中的代码太长,那么没有什么可以阻止你这样做:
namespace {
int foo(char* x) {
return x[0] + x[1];
}
}
namespace {
int bar(char *x, char *y) {
return foo(x) + foo(y);
}
}
Run Code Online (Sandbox Code Playgroud)
在C++ 03中,使用未命名的命名空间的实际优点恰恰在于内容具有外部链接(但在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
}
Run Code Online (Sandbox Code Playgroud)