可能重复:
Why is 'using namespace std;' considered a bad practice in C++?
每次我使用using namespace std
时,我总是觉得“这是一种可怕的编程习惯”。
现在我今年十二月和我的B.S.毕业了。在C.S.但我并不声称知道一切,但没有人解释过为什么这么糟糕。我理解它的作用,但老实说,我没有看到它的大量内容。
有人在乎解释吗?在我看来,它只是让cout
打字比std::cout
更加可忍受。
我可以理解为什么你不想把它放在头文件中,而只是放在一个普通的实现文件中...我不明白为什么会出现这个问题。
答案 0 :(得分:25)
当你大量使用stl时,在你的源文件中使用using namespace std
没有问题,并确保没有任何东西会碰撞。
但是,您通常不需要在整个文件中使用using namespace std
:
你知道吗:
void somefunction()
{
// Use it in a particular scope
using namespace std;
cout << "test" << endl;
}
答案 1 :(得分:16)
在其他地方找到了这个有用的帖子:
命名空间分离和组织功能。您可以拥有xander333::sort()
功能,但不会与std::sort()
或boost::sort()
或任何其他类型()冲突。没有名称空间,只能有一个sort()
。
现在让我们说你已经把“使用命名空间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
新包含的)可以实现更好的匹配,因为您正在调用类型与声明的类型不完全匹配。
相关讨论的主题在这里:
答案 2 :(得分:5)
我所知道的“良好做法”不是将using namespace
放入包含文件中,而是可以在您的私人.cpp文件中随意使用它。我知道那些喜欢完全合格的人,有些人(比如我)假设string
是std::string
,除非另有说明。
这样做的原因是,如果/当其他人使用您的包含文件(并且总是这样),他们就会被迫接受您的编程风格。
祝你好运!答案 3 :(得分:4)
我的偏好是:
永远不会在头文件中放置一个using指令(包含你的标题的东西可能不喜欢你强迫他们使用using指令的事实。)
总是做一些事情,比如使用std :: cout;在实现文件的顶部,所以我不必在我的代码中到处执行std :: cout。
答案 4 :(得分:2)
这主要是关于良好的家务管理。如果你真的不打算在命名空间中使用多个标识符,为什么要通过将该命名空间中的所有标识符转储到你的命名空间来混乱你自己的命名空间?最好使用using std::cout
。但是,如果您非常严重地使用命名空间并且不会导致任何冲突,请继续使用using namespace
。
答案 5 :(得分:1)
除了避免潜在的命名冲突之外不使用using
的另一个原因是加速IDE并可能编译。
如果您使用的是Visual Studio,using namespace std
和/或using namespace boost
可以完全杀死智能感知。这些命名空间中有许多符号,您可能没有意识到并将它们转储到全局命名空间中可能是荒谬的。
答案 6 :(得分:0)
避免使用整个命名空间的语句有助于防止库之间的意外冲突。假设您创建了自己的类,其名称与std
中的名称相同,那么除非您明确使用std::
,否则您将遇到名称冲突。
最好尽量避免这样的冲突,但是如果你为代码中的每个成员指定命名空间,那就不那么模糊了。
如果你厌倦了一直输入std :: cout,你可以只为那个成员使用using语句。