关于使用' using‘与std命名空间,似乎有不同的观点。
一些人说使用‘using namespace std
',另一些人说不要,而是给要与’std::
‘一起使用的std函数加上前缀,而另一些人则说使用类似这样的东西:
using std::string;
using std::cout;
using std::cin;
using std::endl;
using std::vector;
用于要使用的所有std函数。
每种方法的优缺点是什么?
发布于 2009-08-12 09:12:37
大多数C++用户都很喜欢阅读std::string
、std::vector
等。事实上,看到一个原始的vector
会让我怀疑这是std::vector
还是一个用户定义的vector
。
我一直反对使用using namespace std;
。它将所有类型的名称导入到全局名称空间中,并可能导致各种不明显的歧义。
下面是std
名称空间中的一些常见标识符: count、sort、find、equal、reverse。拥有一个名为count
的局部变量意味着using namespace std
不能让您使用count
而不是std::count
。
不想要的名称冲突的典型示例如下所示。想象一下,您是一个初学者,不了解std::count
。想象一下,你要么在<algorithm>
中使用其他东西,要么它被一个看似不相关的头所拉入。
#include <algorithm>
using namespace std;
int count = 0;
int increment()
{
return ++count; // error, identifier count is ambiguous
}
该错误通常很长且不友好,因为std::count
是一个包含一些长嵌套类型的模板。
不过,这是可以的,因为std::count
进入全局名称空间,而函数count将其隐藏。
#include <algorithm>
using namespace std;
int increment()
{
static int count = 0;
return ++count;
}
也许有点令人惊讶的是,这是可以的。导入到声明性作用域中的标识符出现在公共命名空间中,该命名空间包含了它们的定义位置和导入位置。换句话说,std::count
在全局名称空间中以count
的形式可见,但仅在increment
中可见。
#include <algorithm>
int increment()
{
using namespace std;
static int count = 0;
return ++count;
}
出于类似的原因,count
在这里是模棱两可的。using namespace std
不会导致std::count
,请像预期的那样隐藏外部count
。using namespace
规则意味着(在increment
函数中) std::count
看起来好像是在全局范围内声明的,即在与int count = 0;
相同的范围内,因此导致了歧义。
#include <algorithm>
int count = 0;
int increment()
{
using namespace std;
return ++count; // error ambiguous
}
发布于 2009-08-12 09:07:50
排除基础(如果没有'using namespace std‘,则必须在所有stl对象/函数的前面添加std::并减少冲突的可能性)
同样值得注意的是,您永远不应该将
using namespace std
在头文件中,因为它可以传播到包括该头文件的所有文件,即使它们不想使用该名称空间。
在某些情况下,使用像这样的东西非常有益
using std::swap
如果有一个专门的交换版本,编译器将使用它,否则它将依赖于std::swap
。
如果调用std::swap
,则始终使用基本版本,它不会调用优化版本(如果存在)。
发布于 2009-08-12 09:16:08
如果您的代码中没有名称与std和其他库冲突的风险,您可以使用:
using namespace std;
但是,如果您想准确地了解文档代码的依赖关系,或者存在名称冲突的风险,请使用另一种方法:
using std::string;
using std::cout;
第三个解决方案,不要使用这些解决方案,在每次代码中使用之前编写std::,这会给你带来更多的安全性,但是,代码中可能会有一点繁重……
https://stackoverflow.com/questions/1265039
复制相似问题