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

Placing a namespace-scope file-local (.cpp) constant in an anonymous namespace or not

本文关键字:命名空间 常量 范围 文件 是否 cpp      更新时间:2023-10-16

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和其他东西是一致的。