将命名空间范围文件 - 本地(.cpp)常量放在匿名命名空间中

dfr*_*fri 5 c++ namespaces linkage c++11 c++03

在命名空间范围内声明的(文件本地; .cpp)const限定变量具有内部链接,因此是转换单元本地.在匿名命名空间中仍然存在仍然包装常量的原因吗?

例如,有没有理由更喜欢以下两种中的任何一种,如果是这样,为什么呢?

// file.cpp
namespace foo {

const int kMyLocalConstant = 42;  // internal linkage

}  // namespace foo
Run Code Online (Sandbox Code Playgroud)

VS

// file.cpp
namespace foo {
namespace {

const int kMyLocalConstant = 42;  // internal linkage

}  // namespace
}  // namespace foo
Run Code Online (Sandbox Code Playgroud)

我很高兴能得到C++ 03以及C++ 11的答案,如果这个上下文中有两个不同的话.


可能重复

我已经阅读了优秀的答案

但我没有看到它回答我的具体问题(如果我错了请纠正我),因为答案集中在非const变量标识符和非静态自由函数上.我的问题集中在文件本地命名空间范围的常量,即已经具有内部链接的变量标识符.也许有一个我没有找到的更合适的骗局.

Bar*_*rry 4

强烈喜欢未命名的名称空间。

为什么?因为它使规则非常容易记住:如果我要创建一个旨在位于翻译单元本地的变量/函数/模板,我会无条件地将其放入未命名的命名空间中,然后我就不必这样做又担心什么了。

确实,既没有显式声明为 extern 也没有事先声明为具有外部链接的非易失性 const 限定类型的非内联变量也将具有内部链接,但是您真的要选择将非常量变量放入一个未命名的命名空间,但 const 位于其之外?如果您不小心忘记了以下内容,这将很容易出错const

// some_tu.cpp
namespace foo {
    int oops = 42;
}
Run Code Online (Sandbox Code Playgroud)

你会混合搭配吗?这很奇怪:

// some_other_tu.cpp
namespace foo {
    const int a = 0;
    namespace {
        int b;
    }
}
Run Code Online (Sandbox Code Playgroud)

未命名的命名空间是免费的 - 唯一的成本是键入它所需的字符。这意味着没有人必须盯着这段代码并必须回忆起 [basic.link] 规则的所有微妙之处。