是否将命名空间范围文件本地 (.cpp) 常量放在匿名命名空间中
Placing a namespace-scope file-local (.cpp) constant in an anonymous namespace or not
A (file-local; .cpp( 在命名空间范围内声明的 const 限定变量具有内部链接,因此是本地转换单元。是否有任何理由/效果仍然将常量包装在匿名命名空间中?
例如,是否有任何理由更喜欢以下两个中的任何一个,如果是,为什么?
// 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 的答案,如果两者在此上下文中有任何不同的话。
可能的重复项
我已经阅读了出色的答案
- 为什么使用未命名的命名空间,它们有什么好处?
但我没有看到它回答我的特定问题(如果我错了,请纠正我(,因为答案侧重于非常量变量标识符和非静态自由函数。我的问题集中在文件本地命名空间范围的常量上,即已经具有内部链接的变量标识符。也许有一个更合适的骗子我没有找到。
强烈喜欢未命名的命名空间。
为什么?因为它使规则很容易记住:如果我正在创建一个旨在作为翻译单元本地的变量/函数/模板,我会无条件地将其放在一个未命名的命名空间中,然后我就不必担心任何事情了。
的确,既没有明确声明 extern 也没有先前声明为具有外部链接的非易失性 const 限定类型的非内联变量也将具有内部链接,但是您真的会选择将非 const 变量放在未命名的命名空间中,而是将 const 变量放在一个命名空间之外吗?如果您不小心忘记了const
,这将容易出错:
// some_tu.cpp
namespace foo {
int oops = 42;
}
你会混搭吗?这很奇怪:
// some_other_tu.cpp
namespace foo {
const int a = 0;
namespace {
int b;
}
}
未命名的命名空间是免费的 - 唯一的成本是键入它所需的字符。这意味着没有人必须盯着这段代码,不必回忆起[basic.link]规则的所有微妙之处。
未命名的命名空间是多余的,在这种情况下使用它没有任何好处。
我将const
放入未命名命名空间的唯一情况是当有其他东西(函数等(时,它们也应该有内部链接,并且const
和其他东西是一致的。
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 通过继承类使用来自不同命名空间的运算符
- 使用命名空间时出现多个定义错误
- C++ - 是否将常量幻数放入命名空间
- 是否将命名空间范围文件本地 (.cpp) 常量放在匿名命名空间中
- 如何修复带有命名空间的标头中常量的重定义错误?
- 为什么我不能在标头中只定义一个非常量 gloabal 变量?如果我使用命名空间,为什么我必须声明它"extern"?
- 外部常量,未命名的命名空间
- 如何在另一个命名空间中使用常量定义的外部
- 命名空间中常量结构、类和数组的初始化
- 如何在类命名空间中使用常量作为数组和模板参数
- 在命名空间中定义双常量的最佳方式是什么
- 命名空间中的常量全局变量
- 在cpp文件的命名空间中定义常量
- 正在初始化命名空间中的常量对象
- 如何使用外部链接在命名空间范围内定义常量双精度
- 为什么要在类而不是命名空间中定义常量