使用namespace..like坏吗?

19 c++ syntax namespaces

可能重复:
为什么'使用命名空间std;' 在C++中被认为是一种不好的做法?

每次我使用using namespace std我总是得到"这是一个可怕的编程习惯".现在我今年十二月毕业了我的CS学士学位,但我并不认识一切,但没有人解释过为什么这么糟糕.我理解它的作用,但老实说,我没有看到它的大量内容.

有人在乎解释吗?在我看来,它只是让打字cout变得更加可忍受std::cout.

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

ere*_*eOn 25

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

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

你知道吗:

void somefunction()
{
  // Use it in a particular scope
  using namespace std;

  cout << "test" << endl;
}
Run Code Online (Sandbox Code Playgroud)

  • 警告:你肯定不知道.(除非你永远不会改变编译器/库版本) (3认同)

Orb*_*bit 16

在其他地方发现了这个有用

命名空间分离和组织功能.您可以拥有一个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/

  • 或者更简单地说,将来很容易发生名称冲突,事后他们可能会阴险地纠正. (4认同)

Tof*_*eer 5

我的偏好是:

  1. 永远不要在头文件中放置 using 指令(包含您的头文件的内容可能不喜欢您强迫它们使用 using 指令的事实)。

  2. 总是做像使用 std::cout 之类的事情;在实现文件的顶部,所以我不必在我的代码中到处执行 std::cout 。


dav*_*vka 5

我所知道的"良好做法"不是放入using namespace包含文件,而是可以在您的私人.cpp文件中随意使用它.我知道那些喜欢完全合格的人,有些人(比如我)认为这stringstd::string除非另有说明.

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

祝好运!