【问题标题】:Use of "using" in header files在头文件中使用“使用”
【发布时间】:2011-05-03 11:38:15
【问题描述】:

我明白了,我不应该在头文件中使用它:

using namespace foo;

因为它为使用我的头文件的任何人带来了全局范围内的命名空间 foo。

如果我在自己的命名空间中执行此操作,是否可以防止这种情况发生?比如这样:

namespace my_lib
{
    using namespace foo;

    // my stuff
    // ...
}

现在 using 命名空间 foo 应该被限制在命名空间 my_lib 的范围内吧?

【问题讨论】:

  • 请注意,这会将命名空间foo 的全部内容拖到命名空间my_lib 中。这真的是您想要为您的用户提供的吗?它可能比污染全局命名空间更好,但你仍然在污染 a 命名空间...
  • 您只是想缩短命名空间吗?而不是foo::bar::box::action() 你想要my_lib::action() 在这种情况下你想要的是命名空间别名namespace my_lib = foo::bar::box;

标签: c++ namespaces using


【解决方案1】:

是的。这比在全局级别使用 using namespace foo 更好。

如果你使用foo::name 语法会更好。

现在 using 命名空间 foo 应该被限制在命名空间 my_lib 的范围内吧?

是的。它将命名空间foo 中的所有名称带入命名空间my_lib,这可能会导致my_lib 中的名称冲突。这就是为什么foo::name 是最可取的方法。

【讨论】:

  • 我不同意总是使用完整的命名空间名称是合适的。在作用域中使用别名和引入名称极大地简化了代码。如果my_lib 的用户几乎总是需要使用foo,那么合并它们的范围是有意义的。
  • @edA-qa mort-ora-y:如果出现名称冲突怎么办?另外,my_lib 可能会引用其他十几个命名空间中的其他名称,那么这是否意味着它应该对所有命名空间使用 using namespace xyz
  • 我也赞成将名称纳入范围,因为这样可以使生成的代码更易于阅读。但是,有一些方法可以实现它并没有任何重大缺点(例如,见下文)。
  • 冲突总是可能的,但我看不出有任何理由说明它们的可能性会阻止您导入名称。如果打算将一个命名空间分层在另一个命名空间上,则只需避免冲突。如果两个命名空间完全不相关,则可能不应该导入名称。
  • @edA-qa mort-ora-y:您的评论并没有真正解决名称冲突的问题。正如我所说,如果发生名称冲突怎么办?此外,将包含函数的多个名称带入范围可能会产生问题 ADL 和其他名称查找,这可能会产生意外的函数解析,等等!
【解决方案2】:

是的,如果您这样做,那么它只会将 foo 中的所有名称带入 my_lib - 正如其他人所指出的那样,这可能是可取的,也可能不是可取的。

除了其他人所说的之外,我会观察到的一件事是,您可以使用“命名空间中的 using 指令”的想法来模拟仅限于类范围的 using 指令。请注意,这是非法的:

class C
{
  using namespace boost; // for example

  // ...
};

但你可以这样做:

namespace C_Namespace {
  using namespace boost;

  class C
  {
  };
}

using C_Namespace::C; // bring C itself back into the global namespace

只是想如果您真正想要的是能够定义某些东西(如类)而无需一直编写特定的命名空间前缀,那么您可能会发现它很有用。

【讨论】:

    猜你喜欢
    • 2017-05-31
    • 2021-10-19
    • 2014-04-07
    • 1970-01-01
    • 2021-12-26
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多