我应该到处使用std ::和boost ::前缀吗?

时间:2009-07-12 09:27:49

标签: c++

在我的C ++代码中,我不使用声明using namespace std;using namespace boost;。这使我的代码更长,意味着更多的输入。我正在考虑开始使用“使用”声明,但我记得有些人反对这一点。建议的做法是什么?标准和助力是如此常见,那应该没有太大的伤害?

7 个答案:

答案 0 :(得分:16)

我只在C ++文件中使用using namespace,而不在标题中。此外,大多数时候都不需要使用孔名称空间。例如,您可以编写using boost::shared_ptrusing std::tr1::shared_ptr以便在shared_ptr实施之间轻松切换。

样品:

#include <iostream>

using std::cout;

int main()
{
    cout << "test" << std::endl;
    return 0;
}

答案 1 :(得分:15)

Using namespace ...并非仅仅是为了娱乐而发明的。

如果你有充分的理由使用它,那么这样做(并且经常使用这些命名空间中的东西是正确的理由)。不要听狂热分子告诉你他们不想做的一切,因为不明原因本身就是邪恶的。

然而,在这些方面推理的一个很好的来源是C ++ FAQ lite: http://www.parashift.com/c++-faq-lite/coding-standards.html#faq-27.5

我已阅读并仍然决定按照您的意愿使用它。现在您可以做出明智的决定: - )

答案 2 :(得分:6)

我自己的规则是:

  • 在头文件中,所有名称都是明确限定的,例如{/ 1}},std::string等在使用时
  • 在源文件中,使用文件顶部常用名称的子句,例如。使用std::cout
  • 从不在生产代码中使用std::string;

答案 3 :(得分:4)

代码混乱了:: std ::前缀这一事实在阅读代码时确实很烦人。但是,您想要尽可能容易地知道符号所在的命名空间...

现在不是IDE的工作吗?

只要我的IDE不支持'查看短类型名',我就倾向于using声明常见的符号(即STL,boost,...)。可读性首先!

答案 4 :(得分:4)

要记住的一个因素是std命名空间以这种方式命名以缩短它。 std::前缀只有5个字符,几乎不是世界末日。这与.NET的命名空间不同,如System.Collections.Generic。它的设计易于打字。

出于这个原因,我通常只输入std前缀。 Boost也不是太糟糕,所以我通常也会输入它。

我通常将子命名空间(例如boost::filesystem)别名为更短的(例如namespace fs = boost::filesystem

使用typedef也有帮助。 如果我需要经常引用某个类型,我可能只为其添加using

但我通常会尽量避免在标题中使用using,当我使用它们时,我更喜欢将它们放在函数范围内以避免污染实际的命名空间。

C ++提供了许多工具,可以避免必须指定命名空间,而不会污染全局命名空间。

答案 5 :(得分:1)

在头文件中,是的。那是因为使用“使用std :: name_of_std_member;”或使用“using namespace std;”在头文件中将导致包含该头文件的所有其他文件在全局范围内看到符号,从而破坏了命名空间的目的。但是,在源文件中,使用“using namespace std;”是完全可以的。使用“std ::”前缀使该命名空间的符号可用。

答案 6 :(得分:0)

我只在函数体中使用using namespace 。在头文件中,我总是明确地限定命名空间。

很少(当复制粘贴同事的模型代码时),我在命名空间范围内使用using namespace(即整个翻译单元)。