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

新手上路,请多包涵

我听说 using namespace std; 是不好的做法,我应该直接使用 std::coutstd::cin 。为什么是这样?是否有风险声明与 std 命名空间中的某物具有相同名称的变量?

原文由 akbiggs 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 631
2 个回答

考虑两个名为 Foo 和 Bar 的库:

 using namespace foo;
using namespace bar;

一切正常,您可以毫无问题地从 Foo 调用 Blah() Quux() 从 Bar 调用 — 。但是有一天你升级到 Foo 2.0 的新版本,它现在提供了一个名为 Quux() 的功能。现在您遇到了冲突: Foo 2.0 和 Bar 都将 Quux() 导入到您的全局命名空间中。这将需要一些努力来解决,特别是如果函数参数恰好匹配。

如果您使用过 foo::Blah()bar::Quux() ,那么引入 foo::Quux() 就不会发生。

原文由 Greg Hewgill 发布,翻译遵循 CC BY-SA 4.0 许可协议

为什么使用命名空间标准?

C++ 有一个标准库,其中包含您在构建应用程序时使用的通用功能,如容器、算法等。如果这些使用的名称是公开的,例如,如果它们在全局范围内定义了一个队列类,那么您将永远无法再次使用相同的名称而不会发生冲突。所以他们创建了一个命名空间,std 来包含这个变化。

不使用的原因 1: 不良做法

使用命名空间 std 的语句通常被认为是不好的做法。此语句的替代方法是在每次声明类型时使用作用域运算符 (::) 指定标识符所属的命名空间。尽管该语句使我们免于在我们希望访问定义在 std 命名空间中的类或类型时键入 std:: ,但它会将整个 std 命名空间导入程序的当前命名空间。

不使用的原因 2: 编译器感到困惑

在玩具程序中导入整个 std 库是可以的,但在生产级代码中,这很糟糕。使用命名空间标准;使命名空间 std 中声明的每个符号都可以在没有命名空间限定符的情况下访问。

例如:

现在,假设您升级到更新版本的 C++,并且更多新的 std 命名空间符号被注入到您不知道的程序中。您可能已经在程序中使用了这些符号。现在编译器将很难确定声明的符号是属于您自己的实现还是来自您在不知道的情况下导入的命名空间。一些编译器会抛出错误。如果你不走运,编译器选择了错误的实现并编译它,这肯定会导致运行时崩溃。

命名空间污染效果:

虽然这种做法对于示例代码是可以的,但将整个 std 命名空间拉入全局命名空间并不好,因为它违背了命名空间的目的并可能导致名称冲突。这种情况称为命名空间污染。

原文由 Muhammad Ali 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题