使用 std:: 与使用 std 命名空间的区别。

34 浏览
0 Comments

使用 std:: 与使用 std 命名空间的区别。

这个问题已经在其他地方有了答案

为什么\"using namespace std;\"被认为是不好的实践?

使用 using 声明的两种方式如下:

using std::string;
using std::vector;

或者

using namespace std;

哪个方式更好?

admin 更改状态以发布 2023年5月20日
0
0 Comments

using std::string;using std::vector;

在全局命名空间中引入一堆符号是一个不好的想法。你应该使用std命名空间前缀,这样你就知道你正在使用标准库容器。在我看来,这比两种选项都好。

如果你只是使用标准库而不使用其他任何库,并且永远不会向你的项目中添加任何其他库,请尽管使用using namespace std; - 在这种情况下,你感觉更舒适即可。"永远不要使用using namespace std;"的惯例来自于许多其他库定义了诸如stringvector等内容。永远不要导入整个命名空间是一个好的实践,但在你的情况下,它不应该引起任何问题。

0
0 Comments

这要看具体情况。

如果你想把单独一个名称注入到另外一个作用域中,那么使用using-declaration更好,例如:

namespace foolib
{
  // allow vector to be used unqualified within foo,
  // or used as foo::vector
  using std::vector;
  vector vec();
  template struct Bar { T t; };
  template
  void swap(Bar& lhs, Bar& rhs)
  {
    using std::swap;
    // find swap by ADL, otherwise use std::swap
    swap(lhs.t, rhs.t);
  }
}

但是有时你只想使用所有名称,而这正是using-directive所做的。这可以在函数中本地使用,也可以在源文件中全局使用。

除非你知道确切的声明,否则不要在头文件中使用using namespace,因为你不知道头文件之前或之后可能会有什么其他声明。尽管很多人仍然不赞成此用法(在这里的答案中可以了解更多细节):

#include 
#include 
#include "foolib.h"
using namespace foo;  // only AFTER all headers
Bar b;

使用using-directive的一个好理由是,命名空间只包含少量名称,这些名称故意分离,并且设计成使用using-directive:

#include 
// make user-defined literals usable without qualification,
// without bringing in everything else in namespace std.
using namespace std::string_literals;
auto s = "Hello, world!"s;

因此,没有单一的答案可以说哪个在所有情况下都更好,它们有不同的用途,每个用途在不同的上下文中都更好。

关于第一个using namespace用法,C++的创建者Bjarne Stroustrup在《The C++ Programming Language,第四版》的§14.2.3中有这样的说法(强调是我的):

通常,我们想使用命名空间中的每个名称而不需加前缀Qualification。这可以通过为命名空间中的每个名称提供一个using-declaration来实现,但这很麻烦,并且每次添加或删除名称时需要额外的工作。或者,我们可以使用一个using-directive来请求我们的范围内可以访问来自命名空间的每个名称而不需要加Qualification。[...]
  [... ] 使用using-directive使来自一个经常使用且非常熟悉的库的名称无需Qualification成为可用的很流行的技术,用于简化代码。[ 本书中使用这种技术访问标准库设施。 [...]
  在函数内,using-directive可以安全地用作符号便利性,但是必须小心使用全局using-directive,因为过度使用会导致正是命名空间引入的名称冲突。[..。]
  因此,我们在全局范围内使用using-directive必须小心。特别是,不要在头文件中全局范围内放置using-directive,除非在非常专业的情况下(例如以帮助过渡),因为你永远不知道一个头文件可能会被包含。

对我来说,这比仅坚持使用不当并且不应该使用更好。

0