【问题标题】:C++ using for std and boost namespace best practice [duplicate]C ++使用std和boost命名空间最佳实践[重复]
【发布时间】:2010-12-12 21:28:34
【问题描述】:

可能重复:
Do you prefer explicit namespaces or 'using' in C++?

我是 C# 开发人员,但我的朋友是 C++ 开发人员。他向我展示了包含std::for_eachboost::bind 之类的调用的代码。我在 C# 中使用过,并认为使用指令会提高代码的可读性和更快的开发速度。例如,在 C# foreach 语句之前键入任何命名空间都会让人头疼。

我想知道使用这些流行的命名空间有什么优缺点?

包含这些命名空间是否是最佳实践?

【问题讨论】:

  • 有很多骗子。我不认为这个问题是一个好问题,因为其他方面的答案很少。
  • 好吧,我在问什么是最佳实践,我可以从那篇文章中看到显式 std:: 的好处,但它是否是跨严肃 C++ 项目的真正最佳实践?我可以看到 27 的评分,但我也可以看到很多人说使用 std 和 boost 很好。
  • 例如,他说如果用户想要定义向量类,使用 std 可能会产生问题,但有人可能会说创建与 STD 类同名的类是不好的做法。我认为唯一真正的问题是计数,因为它可以在任何用户创建的类中使用。现在是否有足够的理由在其他任何地方键入 std:: 以避免与 STD 计数冲突?

标签: c++ using


【解决方案1】:

首先,我们来做两个区分:

1) 有使用 using namespace std; 之类的指令和使用 using std::cout; 之类的声明

2) 您可以将 using 指令和声明放在头文件 (.h) 或实现文件 (.cpp) 中

此外,使用指令和声明将名称带入编写它们的命名空间,即

namespace blah
{
    using namespace std; // doesn't pollute the *global* namespace, only blah
}

现在,就最佳实践而言,很明显将 using 指令和声明放在头文件中全局命名空间是一个可怕的禁忌。人们会因此而讨厌你,因为任何包含该标头的文件都会污染其全局命名空间。

将 using 指令和声明放在实现文件中更容易接受,尽管它可能会或可能不会使代码不太清晰。一般来说,在这种情况下,您应该更喜欢使用声明而不是使用指令。我自己的偏好是始终指定命名空间,除非它太长(那么我可能会受到诱惑)。

在标题中,如果每次都输入命名空间真的很乏味,你总是可以引入一个“本地”命名空间,例如

namespace MyLocalName
{
    using namespace boost;

    class X
    {
        // can use things from boost:: here without qualification
    };
}

using MyLocalName::X; // brings X back into the global namespace

但永远不要将using namespace boost; 或类似的东西放在某个地方,它会将所有内容从 Boost 拖到全局命名空间本身以供其他人使用。

【讨论】:

  • 头文件没有问题。很明显,它们不适合使用。问题是 - 一般 C++ 程序员对此的看法,我相信一些严肃的公司有编码标准,所以我问他们对此有何看法。我不认为它依赖于程序员,而不是依赖于公司。
  • @Valentin:Google 的风格指南对它有所说明,因为它的价值:google-styleguide.googlecode.com/svn/trunk/cppguide.xml>。并不是说我同意那里的所有内容,但在这一点上似乎足够明智。
  • 是的,正如我所看到的那样,他们很清楚地反对它。我猜我收到的信息可以称为故事的结尾,gogo std::for_each!
  • 很高兴它有帮助。顺便说一句,我向其他可能阅读以上链接的人道歉——很明显,尾部尖括号需要删除,抱歉(我不能再编辑它了)。
  • 只是为了添加答案。对于长名称空间,您始终可以使用别名。例如,“命名空间 bf = boost::filesystem; bf::file_size("test");”
【解决方案2】:

我反对using namespace 声明,除了可能在函数体中的局部。在每个标识符之前写完全限定的命名空间一点也不痛苦,除非你每天写 500 个 loc。

【讨论】:

  • 这并不是说写起来很痛苦——而是在某些情况下阅读会很痛苦。例如,在创建 Boost 多索引容器时对所有内容进行完全限定会使生成的代码难以理解。就我个人而言,我认为 using 在这种情况下是一个很好的例子,只要你不污染任何你不应该污染的命名空间。
  • 相比之下,我发现从命名空间中剥离的代码很难阅读,我什至想知道“字符串”是从哪里来的,当它没有以“std::”为前缀时
  • @ognian:总的来说,我完全同意你的看法——我很少在自己的代码中使用using。但在某些情况下,我认为这是合理的。
  • 完全限定所有名称对于长命名空间名称或深度(阅读:2 级以上)命名空间嵌套通常会变得很痛苦。我不介意一直输入std::vector,但如果是standard::containers::vector,我会高度倾向于将using 指令放在所有地方。
  • @André:说得好,尤其是说“到处都是”——我只会将using 指令放在函数体中,其中长命名空间被使用了两次以上。
猜你喜欢
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 2014-07-21
  • 2014-02-16
  • 1970-01-01
  • 2010-10-03
  • 2010-12-26
  • 1970-01-01
相关资源
最近更新 更多