关于c ++:使用namespace..like不好?

Is using namespace..like bad?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Why is 'using namespace std;' considered a bad practice in C++?

每次我使用using namespace std时,我都会得到"这是一个糟糕的编程习惯"。我今年12月就要从C.S.毕业了,但我并没有声称什么都知道,但从来没有人解释过为什么这件事如此糟糕。我明白它的作用,但我真的看不出有什么大不了的。

有人愿意解释吗?在我看来,这使得输入coutstd::cout更容易接受。

我可以理解为什么你不想把它放在一个头文件中,而只是放在一个普通的实现文件中…我不明白为什么会有问题。


在源文件中大量使用stl并确保不会发生冲突时,使用using namespace std没有问题。

但是,通常您不需要在整个文件中使用using namespace std或不使用:

你知道你可以:

1
2
3
4
5
6
7
void somefunction()
{
  // Use it in a particular scope
  using namespace std;

  cout <<"test" << endl;
}


在其他地方找到了这个有用的帖子:

名称空间分离并组织功能。您可以使用xander333::sort()函数,它不会与std::sort()boost::sort()或任何其他类型()冲突。没有名称空间,只能有一个sort()

现在假设您在所有源文件中都放置了"using namespace std";并且在其中一个文件的全局命名空间中实现了一个名为fill()的简单模板化函数。这个文件还依赖于libfoo--foo.hpp的头文件。libfoo的2.1版突然出现,你的程序不再编译。你版本的fill()突然与另一个fill()发生冲突!怎么搞的?

事实证明,实施libfoo的人以前没有加入到新版本的foo.hpp中。现在您的源文件中包含了所有的标准算法,并且您的using namespace std;已经将它们全部拉入了全局名称空间。std::fill()现在与你的fill()直接冲突。

更阴险的是,你已经通过将你的fill()重命名为xander333_fill()来编译你的代码了,但是有些地方不正常——你的报告编号已经关闭了。原来,由于调用类型与声明的类型不完全匹配,因此不再调用执行固定精度数学运算的自定义divides()函数(也是foo.hpp新包含的模板函数),因为调用的类型与声明的类型不完全匹配。

下面是相关讨论的主题:

http://www.cplusplus.com/forum/unices/27805/


我知道的一个"好做法"是不要将using namespace放在include文件中,而是在您的私有.cpp文件中随意使用它。我认识一些人,他们喜欢一切都是完全合格的,还有一些人(像我一样)认为,除非另有说明,stringstd::string的。

这样做的原因是,如果/当其他人使用您的include文件时(这种情况总是发生),他们将被迫接受您的编程风格。

祝你好运!


我的偏好是:

  • 不要将using指令放在头文件中(包含头文件的内容可能与强制它们使用using指令的事实不同)。

  • 总是在实现文件的顶部使用std::cout;这样我就不必在代码中的任何地方使用std::cout。


  • 主要是关于良好的内务管理。如果您不打算在一个名称空间中使用几个以上的标识符,为什么要通过将该名称空间中的所有标识符都转储到您的名称空间中而使自己的名称空间变得杂乱无章呢?最好使用using std::cout。但是,如果您非常频繁地使用一个名称空间,并且它不会造成任何冲突,那么继续使用using namespace


    除了避免潜在的命名冲突之外,不使用using的另一个原因是加速您的IDE并可能编译。

    如果您使用的是Visual Studio,using namespace std和/或using namespace boost可以完全杀死IntelliSense。这些名称空间中有许多符号您可能没有意识到,将它们转储到全局名称空间可能很滑稽。


    避免对整个命名空间使用语句有助于防止库之间的意外冲突。假设您创建了与std中的某个类同名的类,那么除非您明确使用std::,否则将出现名称冲突。

    最好首先尝试避免这样的冲突,但是如果为代码中的每个成员指定名称空间,那么就不那么模棱两可了。

    如果您厌倦了一直输入std::cout,那么可以只为该成员使用using语句。