是否将名称空间范围的文件本地 (.cpp) 常量放置在匿名名称空间中
Placing a namespace-scope file-local (.cpp) constant in an anonymous namespace or not
在名称空间范围内声明的(文件本地;.cpp)const 限定变量具有内部链接,因此是本地翻译单元。是否有任何理由 to/effect 仍将常量包装在匿名名称空间中?
例如,是否有任何理由比其他两个更喜欢以下两个,如果是,为什么?
// file.cpp
namespace foo {
const int kMyLocalConstant = 42; // internal linkage
} // namespace foo
对
// file.cpp
namespace foo {
namespace {
const int kMyLocalConstant = 42; // internal linkage
} // namespace
} // namespace foo
我很高兴能得到 C++03 和 C++11 的答案,如果两者之间在这个上下文中有任何不同的话。
可能重复
我已经阅读了
的优秀答案
- Why are unnamed namespaces used and what are their benefits?
但我没有看到它回答我的具体问题(如果我错了请纠正我),因为答案集中在非常量变量标识符和非静态自由函数上。我的问题集中在文件本地名称空间范围内的常量,即已经具有内部链接的变量标识符。也许有一个我还没有找到更合适的骗局。
未命名的命名空间是多余的,在这种情况下使用它没有任何好处。
我将 const
放入未命名命名空间的唯一情况是当存在其他内容(函数等)时,它们也应该具有内部链接,并且 const
和其他东西是连贯的。
非常喜欢未命名的命名空间。
为什么?因为它使规则非常容易记住:如果我正在创建一个 variable/function/template 打算在翻译单元本地使用,我将它无条件地放在一个未命名的名称空间中,然后我就不必又担心什么了。
确实 a non-inline variable of non-volatile const-qualified type that is neither explicitly declared extern nor previously declared to have external linkage 也将具有内部链接,但是您真的要选择将非常量变量放在未命名的名称空间中,而将常量变量放在一个名称空间之外吗?如果您不小心忘记了 const
:
,这将很容易出错
// some_tu.cpp
namespace foo {
int oops = 42;
}
你会混搭吗?这很奇怪:
// some_other_tu.cpp
namespace foo {
const int a = 0;
namespace {
int b;
}
}
未命名的命名空间是免费的 - 唯一的成本是输入它所需的字符。这意味着没有人必须盯着这段代码并回忆起 [basic.link] 规则的所有微妙之处。
在名称空间范围内声明的(文件本地;.cpp)const 限定变量具有内部链接,因此是本地翻译单元。是否有任何理由 to/effect 仍将常量包装在匿名名称空间中?
例如,是否有任何理由比其他两个更喜欢以下两个,如果是,为什么?
// file.cpp
namespace foo {
const int kMyLocalConstant = 42; // internal linkage
} // namespace foo
对
// file.cpp
namespace foo {
namespace {
const int kMyLocalConstant = 42; // internal linkage
} // namespace
} // namespace foo
我很高兴能得到 C++03 和 C++11 的答案,如果两者之间在这个上下文中有任何不同的话。
可能重复
我已经阅读了
的优秀答案- Why are unnamed namespaces used and what are their benefits?
但我没有看到它回答我的具体问题(如果我错了请纠正我),因为答案集中在非常量变量标识符和非静态自由函数上。我的问题集中在文件本地名称空间范围内的常量,即已经具有内部链接的变量标识符。也许有一个我还没有找到更合适的骗局。
未命名的命名空间是多余的,在这种情况下使用它没有任何好处。
我将 const
放入未命名命名空间的唯一情况是当存在其他内容(函数等)时,它们也应该具有内部链接,并且 const
和其他东西是连贯的。
非常喜欢未命名的命名空间。
为什么?因为它使规则非常容易记住:如果我正在创建一个 variable/function/template 打算在翻译单元本地使用,我将它无条件地放在一个未命名的名称空间中,然后我就不必又担心什么了。
确实 a non-inline variable of non-volatile const-qualified type that is neither explicitly declared extern nor previously declared to have external linkage 也将具有内部链接,但是您真的要选择将非常量变量放在未命名的名称空间中,而将常量变量放在一个名称空间之外吗?如果您不小心忘记了 const
:
// some_tu.cpp
namespace foo {
int oops = 42;
}
你会混搭吗?这很奇怪:
// some_other_tu.cpp
namespace foo {
const int a = 0;
namespace {
int b;
}
}
未命名的命名空间是免费的 - 唯一的成本是输入它所需的字符。这意味着没有人必须盯着这段代码并回忆起 [basic.link] 规则的所有微妙之处。