可能重复:
您是否更喜欢C++中的显式名称空间或"使用"?
嗨,大家好我是一个C#开发人员,但我的朋友是一个C++,他向我展示了充满了调用的代码,如std :: for_each和boost :: bind,我习惯在C#中使用,并认为使用指令会摇滚为了代码的可读性和通常更快的开发,例如在C#foreach语句之前键入任何命名空间将是一件痛苦的事.
我想知道使用这种流行命名空间的缺点和优点是什么?是否包含这些名称空间是最佳做法?
Stu*_*etz 10
首先,让我们做两个区别:
1)使用类似using namespace std;和使用声明的指令using std::cout;
2)您可以在头文件(.h)或实现文件(.cpp)中使用指令和声明
此外,使用指令和声明将名称带入它们所写的命名空间,即
namespace blah
{
using namespace std; // doesn't pollute the *global* namespace, only blah
}
Run Code Online (Sandbox Code Playgroud)
现在,就最佳实践而言,很明显在全局命名空间中的头文件中使用指令和声明是一个可怕的禁忌.人们会讨厌你,因为包含该标题的任何文件都会使其全局命名空间受到污染.
在实现文件中使用指令和声明稍微可以接受,尽管它可能会或可能不会使代码不那么清晰.通常,您应该更喜欢在这种情况下使用声明来使用指令.我自己的偏好是总是指定命名空间,除非它很烦人(然后我可能会受到诱惑).
在标题中,如果每次输入命名空间变得非常繁琐,您总是可以引入"本地"命名空间,例如
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
Run Code Online (Sandbox Code Playgroud)
但是永远不会把它using namespace boost;或者等价物从某个地方拖到其他人的Boost到全局命名空间本身.