19 c++ syntax namespaces
每次我使用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)
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/
我的偏好是:
永远不要在头文件中放置 using 指令(包含您的头文件的内容可能不喜欢您强迫它们使用 using 指令的事实)。
总是做像使用 std::cout 之类的事情;在实现文件的顶部,所以我不必在我的代码中到处执行 std::cout 。
我所知道的"良好做法"不是放入using namespace包含文件,而是可以在您的私人.cpp文件中随意使用它.我知道那些喜欢完全合格的人,有些人(比如我)认为这string是std::string除非另有说明.
这样做的原因是,如果/当其他人使用您的包含文件(并且这种情况总是发生)时,他们将被迫接受您的编程风格.
祝好运!
| 归档时间: |
|
| 查看次数: |
12563 次 |
| 最近记录: |