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变量标识符和非静态自由函数上.我的问题集中在文件本地命名空间范围的常量,即已经具有内部链接的变量标识符.也许有一个我没有找到的更合适的骗局.
强烈喜欢未命名的名称空间。
为什么?因为它使规则非常容易记住:如果我要创建一个旨在位于翻译单元本地的变量/函数/模板,我会无条件地将其放入未命名的命名空间中,然后我就不必这样做又担心什么了。
确实,既没有显式声明为 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] 规则的所有微妙之处。