C++"使用std :: <type>"vs每次调用std :: <type>

lim*_*imp 2 c++ namespaces using

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

假设我正在使用#include <iostream>C++,我正在制作一个打印语句.我可以选择:

using namespace std;
[...]
cout << "Hello" << endl;
Run Code Online (Sandbox Code Playgroud)

要么

using std::cout;
using std::endl;
[...]
cout << "Hello" << endl;
Run Code Online (Sandbox Code Playgroud)

要么

std::cout << "Hello" << std::endl;
Run Code Online (Sandbox Code Playgroud)

我被引导相信,也许这是不正确的,第一个有点可以避免,因为它会给你的程序增加许多不必要的膨胀.但是,我不知道第二种和第三种风格在性能方面是否存在任何差异.我看到的大多数使用库的代码都倾向于使用第三种风格; 但对我来说,如果在使用第二个方面没有权衡,它似乎是最干净,最易读的方法,特别是如果你对相关的函数或对象进行大量调用.

任何人都可以开导我吗?

Bo *_*son 9

无论您选择哪种方式,都没有性能差异或"膨胀".

但是,如果你这样做,例如

using namespace std;
using namespace boost;
Run Code Online (Sandbox Code Playgroud)

两个命名空间中的名称冲突会让你遇到很多麻烦.

我认为版本3,std::cout在任何地方使用等都更容易阅读,并使您免于未来的名称冲突.

如果这不是你想要的,那么选项2是第二好的,因为它只从命名空间引入了一些选择名称.不过,请注意您的示例中,有一个净损失打字,因为使用含有声明更多的字符比你不打字保存std::在代码的其余部分.


And*_*gia 8

我的经验法则:永远不要放入using namespace.h,但随意在.cpp文件中使用它.特别是当它的时候using namespace std!

  • @AndreaBergia:那是BS,抱歉.我为什么要禁止使用`sort`,`thread`,`find`等名称,或者我无法想象的东西,因为它是C++ 1x的一部分?由于名称冲突如`std :: shared_ptr`和`boost :: shared_ptr`,现在应该提高一半的库吗?命名空间的重点是_enable_ name重用,这样我们就可以摆脱命名约定,如`mysql_connect()`或`andreabergia_link_open()`...使用_clean_名称是权限,使用_generic_ names是权限.禁止名称重用只是无知,因为名称集将不断发展. (5认同)
  • 我同意.你永远不应该在头文件中放入`using`语句,因为你强制它们进入包含它们的任何其他文件.这可能是OP在其他文件中没有看到它的原因:如果它们属于第三方库,则可能是标题.至于.cpp文件,只要你避免名字冲突,只要努力清晰.任何人都不太可能重用`std`命名空间中的名字,所以我再次同意. (3认同)
  • @Gorpik"任何人都不太可能重用std中的名字",你应该看到有多少SO问题归结为重新使用`std`名称并发生冲突.为避免重复使用它们,您首先需要知道它们是命名空间的一部分.我永远不会在任何地方使用`using namespace std`. (2认同)