Possible Duplicate:
Why is 'using namespace std;' considered a bad practice in C++?
每次我使用using namespace std时,我都会得到"这是一个糟糕的编程习惯"。我今年12月就要从C.S.毕业了,但我并没有声称什么都知道,但从来没有人解释过为什么这件事如此糟糕。我明白它的作用,但我真的看不出有什么大不了的。
有人愿意解释吗?在我看来,这使得输入cout比std::cout更容易接受。
我可以理解为什么你不想把它放在一个头文件中,而只是放在一个普通的实现文件中…我不明白为什么会有问题。
- using namespace std是C中的语法错误。但是,using、namespace和std本身就是完全合法的(尽管令人讨厌)标识符,您可以在代码中使用。
- @PMG没人提到过C?
- 在这样的句子中使用"like"是不好的…
- @美加:最初的帖子有一个C标签,现在已经被删除了。不管怎样,我会留下我的评论的:-)
- 这已经被讨论过了,那么,这个问题是如何投票到+9的呢?
- 如果我们想编码的话,我们可以用机器语言来写,但是我们用高级语言来写,因为我们需要很容易理解它。使用std::coutmy::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文件中随意使用它。我认识一些人,他们喜欢一切都是完全合格的,还有一些人(像我一样)认为,除非另有说明,string是std::string的。
这样做的原因是,如果/当其他人使用您的include文件时(这种情况总是发生),他们将被迫接受您的编程风格。
祝你好运!
我的偏好是:
不要将using指令放在头文件中(包含头文件的内容可能与强制它们使用using指令的事实不同)。
总是在实现文件的顶部使用std::cout;这样我就不必在代码中的任何地方使用std::cout。
- 术语检查:使用名称空间std;等等,使用指令(不使用语句)来调用。使用std::cout等是使用声明调用的。:)
- 很长一段时间以来,我做了C++THX,我会修复它:
主要是关于良好的内务管理。如果您不打算在一个名称空间中使用几个以上的标识符,为什么要通过将该名称空间中的所有标识符都转储到您的名称空间中而使自己的名称空间变得杂乱无章呢?最好使用using std::cout。但是,如果您非常频繁地使用一个名称空间,并且它不会造成任何冲突,那么继续使用using namespace。
除了避免潜在的命名冲突之外,不使用using的另一个原因是加速您的IDE并可能编译。
如果您使用的是Visual Studio,using namespace std和/或using namespace boost可以完全杀死IntelliSense。这些名称空间中有许多符号您可能没有意识到,将它们转储到全局名称空间可能很滑稽。
避免对整个命名空间使用语句有助于防止库之间的意外冲突。假设您创建了与std中的某个类同名的类,那么除非您明确使用std::,否则将出现名称冲突。
最好首先尝试避免这样的冲突,但是如果为代码中的每个成员指定名称空间,那么就不那么模棱两可了。
如果您厌倦了一直输入std::cout,那么可以只为该成员使用using语句。