c++ - 匿名命名空间 : Are they really that great?

标签 c++ static namespaces

我一直在使用 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/

相关文章:

c++ - 我如何强制 Windows.h 在 Visual Studio 中静态链接而不是动态链接?

c++ - 如果在其他地方声明为 const,为什么必须在定义时重复 const 说明符?

java - 具有 boolean 返回类型的方法在 main() 内不起作用

Python - 附加到在 for 循环内声明的对象列表

c++ - extern 在命名空间中如何工作?

visual-studio-2010 - 找不到命名空间(ASP.NET MVC 3)

c++ - Makefile 编译内核模块以包含树源文件

C++ 从非成员调用类函数/数据

c++ - 创建一个DLL Delphi,它导出C++类

c# - 在 C# 中使用 Linq 从 XML 获取属性和属性