其他人告诉我, using namespace std;
编写using namespace std;
在代码中是错误的,我应该直接使用std::cout
和std::cin
代替。
为什么using namespace std;
认为是不好的做法? 是效率低下还是冒着声明模棱两可的变量(与std
名称空间中的函数具有相同名称的变量)的风险? 它会影响性能吗?
#1楼
请勿在全球范围内使用
仅在全局使用时才被视为“不良”。 因为:
- 您使正在编程的名称空间混乱。
- 当您使用
using namespace xyz
使用许多标识符时,读者将很难看到特定标识符的来源。 - 对于您的源代码的其他阅读者而言,正确的是对最常使用它的读者:您自己。 一两年后再来看看...
- 如果仅谈论
using namespace std
那么您可能不知道要获取的所有内容-当添加另一个#include
或移动到新的C ++修订版时,可能会遇到您不认识的名称冲突。
您可以在本地使用
继续免费在本地(几乎)使用它。 当然,这可以防止您重复std::
-重复也是不好的。
在本地使用它的习惯用法
在C ++ 03中,有一个习惯用法-样板代码-用于为您的类实现swap
功能。 建议您实际上使用一个using namespace std
的本地-或至少using std::swap
:
class Thing {
int value_;
Child child_;
public:
// ...
friend void swap(Thing &a, Thing &b);
};
void swap(Thing &a, Thing &b) {
using namespace std; // make `std::swap` available
// swap all members
swap(a.value_, b.value_); // `std::stwap(int, int)`
swap(a.child_, b.child_); // `swap(Child&,Child&)` or `std::swap(...)`
}
这具有以下魔力:
- 编译器将选择
std::swap
作为value_
,即void std::swap(int, int)
。 - 如果实现了重载
void swap(Child&, Child&)
则编译器将选择它。 - 如果没有这种重载,编译器将使用
void std::swap(Child&,Child&)
并尝试最好地交换它们。
使用C ++ 11,就没有理由再使用此模式了。 std::swap
的实现已更改为找到潜在的重载并选择它。
#2楼
另一个原因是惊喜。
如果我看到cout << blah
,而不是std::cout << blah
我想:这是cout
吗? 难道是正常cout
? 有什么特别的吗?
#3楼
这根本与性能无关。 但是考虑一下:您正在使用两个名为Foo和Bar的库:
using namespace foo;
using namespace bar;
一切正常,您可以从Foo调用Blah()
并从Bar调用Quux()
而不出现问题。 但是有一天,您将升级到Foo 2.0的新版本,该版本现在提供了称为Quux()
的功能。 现在您有一个冲突:Foo 2.0和Bar都将Quux()
导入到全局名称空间中。 这将需要花费一些时间来解决,特别是在功能参数碰巧匹配的情况下。
如果您使用过foo::Blah()
和bar::Quux()
,那么foo::Quux()
的引入将是非事件。
#4楼
一切都与管理复杂性有关。 使用名称空间会将您不想要的东西拉进去,从而可能使调试变得更加困难(我说可能)。 在所有地方使用std ::很难阅读(更多文字和更多内容)。
课程的马匹-管理您的复杂性,如何才能最好地做到最好。
#5楼
这取决于它的位置。 如果它是公共头,那么您正在通过将其合并到全局名称空间中来减小名称空间的值。 请记住,这可能是使模块全局化的一种巧妙方法。