gpt4 book ai didi

c++ - 是否将 namespace 范围的文件本地 (.cpp) 常量放置在匿名 namespace 中

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:32:46 35 4
gpt4 key购买 nike

在命名空间范围内声明的(文件本地;.cpp)const 限定变量具有内部链接,因此是本地翻译单元。是否有任何理由/效果仍然将常量包装在匿名 namespace 中?

例如,是否有任何理由更喜欢以下两个中的任何一个,如果是,为什么?

// 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 的答案,如果两者之间在这个上下文中有任何不同的话。


可能重复

我已经阅读了优秀的答案

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

最佳答案

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

为什么?因为它使规则很容易记住:如果我正在创建一个变量/函数/模板,打算在翻译单元中使用,我将它无条件地放在一个未命名的命名空间中,然后我就不必又担心什么了。

a non-inline variable of non-volatile const-qualified type that is neither explicitly declared extern nor previously declared to have external linkage 是真的也将具有内部链接,但是您真的要选择将非常量变量放在未命名的 namespace 中,而将常量变量放在一个 namespace 之外吗?如果您不小心忘记了 const,这将很容易出错:

// some_tu.cpp
namespace foo {
int oops = 42;
}

你会混搭吗?这很奇怪:

// some_other_tu.cpp
namespace foo {
const int a = 0;
namespace {
int b;
}
}

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

关于c++ - 是否将 namespace 范围的文件本地 (.cpp) 常量放置在匿名 namespace 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51782964/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com