代码之家  ›  专栏  ›  技术社区  ›  dfrib

是否在匿名命名空间中放置命名空间作用域文件本地(.cpp)常量

  •  5
  • dfrib  · 技术社区  · 6 年前

    在命名空间作用域中声明的(file local;.cpp)常量限定变量具有内部链接,因此是转换单元本地变量。是否有任何理由/效果仍然将常量包装在匿名命名空间中?

    E、 g.有没有理由选择以下两种方式中的任何一种,如果有,为什么?

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


    可能重复

    我读到了

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

    2 回复  |  直到 6 年前
        1
  •  3
  •   Barry    6 年前

    强烈建议使用未命名的命名空间。

    为什么?因为这使得规则很容易记住:如果我创建的变量/函数/模板是翻译单元的本地变量,我会无条件地将其放在一个未命名的名称空间中,然后就不必再担心任何事情了。

    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]规则的所有微妙之处。

        2
  •  1
  •   geza    6 年前

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

    唯一一个我会 const 进入一个未命名的名称空间是当有其他东西(函数等)也应该有内部链接时,并且 常量 其他的东西是连贯的。