使用命名空间..是不好的吗?
使用命名空间..是不好的吗?
这个问题已经有答案了:
每次我使用using namespace std
时,我总会听到\"那是一个可怕的编程习惯\"。
现在我将于今年12月以电脑科学学士学位毕业,但我不自称知道一切,但是没有人曾经解释过这种做法为什么这么糟糕。我明白它的用途,但是我真的不认为这是个大问题。
有人想解释一下吗?在我看来,这只是使输入cout
比std::cout
更加容易忍受。
我能理解为什么你不想将其放到头文件中,但是在普通的实现文件中...我不明白它会是什么问题。
在其他地方找到了这篇有用的帖子:
命名空间可以分离和组织功能。你可以有一个xander333::sort()
函数,它不会与std::sort()
或boost::sort()
或任何其他的sort()发生冲突。如果没有命名空间,就只能有一个sort()
。
现在假设你在所有的源文件中都放了"use namespace std;",并在其中一个文件的全局命名空间中实现了一个简单的模板函数calledfill()
。这个文件还依赖于来自libFoo的头文件-foo.hpp
。2.1版的libFoo出现了,突然你的程序不再编译了。你的fill()
版本突然与另一个fill()
发生了冲突!发生了什么?
事实证明,实现libFoo的人在以前的foo.hpp
中没有包括algorithm
。现在你的源文件中包含了所有标准算法,而你的使用namespace std;
已将它们全部拉到全局命名空间。std::fill()
现在直接与你的fill()
冲突。
更加隐蔽的是,你将你的fill()
重命名为xander333_fill()
,让你的代码编译通过了,但是有些东西不对劲——你的报告数字不正确。原来,你的自定义divides()
函数进行了固定精度计算,但是由于你调用类型与声明类型并不完全匹配,所以foo.hpp
中的模板函数(也是新加入的)会被优先调用。
相关讨论的线程在这里: