使用命名空间..是不好的吗?

17 浏览
0 Comments

使用命名空间..是不好的吗?

这个问题已经有答案了:

每次我使用using namespace std时,我总会听到\"那是一个可怕的编程习惯\"。

现在我将于今年12月以电脑科学学士学位毕业,但我不自称知道一切,但是没有人曾经解释过这种做法为什么这么糟糕。我明白它的用途,但是我真的不认为这是个大问题。

有人想解释一下吗?在我看来,这只是使输入coutstd::cout更加容易忍受。

我能理解为什么你不想将其放到头文件中,但是在普通的实现文件中...我不明白它会是什么问题。

admin 更改状态以发布 2023年5月21日
0
0 Comments

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

命名空间可以分离和组织功能。你可以有一个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中的模板函数(也是新加入的)会被优先调用。

相关讨论的线程在这里:

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

0
0 Comments

当你在大量使用STL并确定没有冲突时,可以在源文件中使用using namespace std,这没有问题。

然而,很多时候你并不需要在整个文件中使用using namespace std

你知道你可以:

void somefunction()
{
  // Use it in a particular scope
  using namespace std;
  cout << "test" << endl;
}

0