使用 std:: 与使用 std 命名空间的区别。
使用 std:: 与使用 std 命名空间的区别。
这个问题已经在其他地方有了答案:
使用 using 声明的两种方式如下:
using std::string; using std::vector;
或者
using namespace std;
哪个方式更好?
这要看具体情况。
如果你想把单独一个名称注入到另外一个作用域中,那么使用using-declaration更好,例如:
namespace foolib { // allow vector to be used unqualified within foo, // or used as foo::vector using std::vector; vectorvec(); 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,除非在非常专业的情况下(例如以帮助过渡),因为你永远不知道一个头文件可能会被包含。
对我来说,这比仅坚持使用不当并且不应该使用更好。