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

时间:2018-08-10 09:12:32

标签: c++ c++11 namespaces c++03 linkage

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

例如,有没有理由偏爱以下两个选项中的任何一个?如果是,为什么?

// file.cpp
namespace foo {

const int kMyLocalConstant = 42;  // internal linkage

}  // namespace foo

vs

// file.cpp
namespace foo {
namespace {

const int kMyLocalConstant = 42;  // internal linkage

}  // namespace
}  // namespace foo

如果在此情况下两者之间有任何不同之处,我非常感谢C ++ 03和C ++ 11的答案。


可能的重复

我已经阅读了关于

的出色答案

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

2 个答案:

答案 0 :(得分:3)

强烈希望使用未命名的命名空间。

为什么?因为它使规则非常容易记住:如果我创建的变量/函数/模板是翻译单元本地的,则可以无条件地将其放在未命名的命名空间中,然后不必再次担心任何事情。

的确,a non-inline variable of non-volatile const-qualified type that is neither explicitly declared extern nor previously declared to have external linkage也具有内部链接,但是您是否真的要选择将非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]规则的所有微妙之处。

答案 1 :(得分:1)

未命名的名称空间是多余的,在这种情况下使用它没有好处。

我将const放入未命名空间的唯一情况是,当还有其他内容(函数等)也应该具有内部链接时,const和其他内容是连贯的。