【问题标题】:Unnecessary use of unnamed namespaces C++ [closed]不必要地使用未命名的命名空间 C++ [关闭]
【发布时间】:2016-09-08 00:32:09
【问题描述】:

我在公司到处都能看到这样的代码:

namespace {

const MAX_LIMIT = 50;
const std::string TOKEN = "Token";

}

我很困惑为什么你需要一个匿名命名空间。一方面,您需要 MAX_LIMITTOKEN 的本地翻译单元。但是由于const,这已经在没有匿名命名空间的情况下实现了。 static const 和简单的const 都实现了本地翻译单元。

另一方面,如果您的文件中某处有一个名称相同的变量,则不会发生命名冲突。

int foo()
{
std::string TOKEN = "MyToken"; // Clash! ::TOKEN vs TOKEN can be used.
}

这将证明匿名命名空间是合理的。但是,您多久需要在函数中使用一个实际上已经被在函数外部声明的const 变量占用的变量名?我的答案是永远不会。所以在实践中,对我来说,不需要未命名的命名空间。有什么提示吗?

【问题讨论】:

  • 我想说的是一致性:这条const 规则只适用于整数类型。
  • @Quentin 嗯?命名空间范围内的const 具有内部链接,除非标记为extern,适用于所有类型
  • @M.M 我的错!我不知道我从哪里回忆起来的,但我也很确定。至少我并不孤单:D
  • 一致性。我怀疑贵公司的编码标准中有几点对于编译器来说是完全不必要的,但对人类很有用。
  • 那么如果简单的 const 有内部链接,那么为什么有人会创建一个变量 static const ?简单的const和静态的const没有区别吗?

标签: c++ namespaces anonymous unnamed-namespace


【解决方案1】:

正如您所解释的,namespace 是多余的。您可以删除 namespace { 和匹配的 }

一个区别是您可以有不同的名称::TOKENunnamed_namespace::TOKEN。但这可能只会增加混乱,最好是编译错误。

不确定您帖子的后半部分是关于什么的,局部变量 TOKEN 会影响 ::TOKENunnamed_namespace::TOKEN。因此,更改不会对这种情况产生影响。

【讨论】:

    【解决方案2】:

    在这种特殊情况下,命名空间确实是多余的,因为 const 命名空间范围变量在默认情况下确实具有内部链接。

    考虑以后更改代码的可能性。也许其中一个变量毕竟不应该是 const 。但是将其设为非 const 也会更改默认链接。即使在这种更改之后,匿名命名空间也会保持内部链接。换句话说,anon 命名空间分离了对 constness 和链接的关注。这是否是一件好事,取决于上下文。

    注意,同样的事情可以通过使用static 关键字来实现。由于这与 anon 命名空间具有完全相同的效果,因此选择主要是审美的,因此基于意见。

    使用匿名命名空间而不是static 的一个论点可能是一致性。您不能定义具有与static 的内部链接的类型。由于某些内部符号(类型)无法在匿名命名空间之外定义,因此您可以约定在匿名命名空间中定义所有内部符号。当然,这样的约定 - 就像约定通常那样 - 是一种品味问题。

    您的第二个反驳论点似乎是在反对不存在的差异。匿名命名空间对隐藏在函数范围内的名称没有影响。

    【讨论】:

    • @LightnessRacesinOrbit 我考虑过是否有办法在意见中添加第三层,但我还不够深入。
    • 你还不够深入...... 在你看来
    【解决方案3】:

    可以说它提高了清晰度。拥有一个匿名命名空间更清楚地表明“这段代码只是这个编译单元的实现细节,而不是作为单元接口的一部分”。因为无论如何您都必须以这种方式为本地类或结构使用匿名命名空间(没有其他方式来本地化它们),以这种方式封装所有本地构造是合理的。

    【讨论】:

      猜你喜欢
      • 2016-12-25
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      • 2019-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多