为什么“使用命名空间标准”被认为是不好的做法?

放肆的年华 提交于 2019-12-06 08:43:48

其他人告诉我, using namespace std;编写using namespace std; 在代码中是错误的,我应该直接使用std::coutstd::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楼

这取决于它的位置。 如果它是公共头,那么您正在通过将其合并到全局名称空间中来减小名称空间的值。 请记住,这可能是使模块全局化的一种巧妙方法。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!