C ++使用std和boost命名空间最佳实践

时间:2010-12-12 21:28:35

标签: c++ using

  

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

大家好我是一个C#开发人员,但是我的朋友是一个C ++专家,他向我展示了代码,里面充满了像std :: for_each和boost :: bind之类的调用,我习惯在C#中使用并认为使用为了代码的可读性和通常更快的开发,指令会摇摆不定,例如在C#foreach语句之前键入任何命名空间将是一件痛苦的事。

我想知道使用这种流行命名空间的缺点和优点是什么? 是否最好包含这些名称空间?

2 个答案:

答案 0 :(得分:10)

首先,让我们做两个区别:

1)使用using namespace std;等指令并使用using std::cout;等声明

2)您可以在标题(.h)或实现文件(.cpp)中使用指令和声明

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

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

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

在实现文件中使用指令和声明稍微可以接受,尽管它可能会也可能不会使代码不那么清晰。通常,您应该更喜欢在这种情况下使用声明来使用指令。我自己的偏好是始终指定命名空间,除非它很烦人(然后我可能会被诱惑)。

在标题中,如果每次输入命名空间变得非常繁琐,您可以随时引入“本地”命名空间,例如

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拖到其他人的全局命名空间本身。

答案 1 :(得分:0)

我反对using namespace语句,除了函数体内的本地语句。在每个标识符之前编写完全限定的命名空间并不是一件痛苦的事情,除非你每天写的是500个字符串。