匿名命名空间:它们真的那么棒吗?

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)

  • @kotlinksi:嗯,你是那个说可读性问题的人,你只在几个代码屏幕中输入一次`namespace {}`.现在你说这是一个可写性问题,不止一次输入它.如果您可以使用内部链接管理功能,那么您可以使用`static`.如果由于某种原因你需要具有外部链接的函数,那么`static`的优点是什么并不重要,因为你不能拥有它们. (4认同)