首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用标准命名空间

使用标准命名空间
EN

Stack Overflow用户
提问于 2009-08-12 08:59:16
回答 12查看 108.1K关注 0票数 118

关于使用' using‘与std命名空间,似乎有不同的观点。

一些人说使用‘using namespace std',另一些人说不要,而是给要与’std::‘一起使用的std函数加上前缀,而另一些人则说使用类似这样的东西:

代码语言:javascript
复制
using std::string;
using std::cout;
using std::cin;
using std::endl;
using std::vector;

用于要使用的所有std函数。

每种方法的优缺点是什么?

EN

回答 12

Stack Overflow用户

发布于 2009-08-12 09:12:37

大多数C++用户都很喜欢阅读std::stringstd::vector等。事实上,看到一个原始的vector会让我怀疑这是std::vector还是一个用户定义的vector

我一直反对使用using namespace std;。它将所有类型的名称导入到全局名称空间中,并可能导致各种不明显的歧义。

下面是std名称空间中的一些常见标识符: count、sort、find、equal、reverse。拥有一个名为count的局部变量意味着using namespace std不能让您使用count而不是std::count

不想要的名称冲突的典型示例如下所示。想象一下,您是一个初学者,不了解std::count。想象一下,你要么在<algorithm>中使用其他东西,要么它被一个看似不相关的头所拉入。

代码语言:javascript
复制
#include <algorithm>
using namespace std;

int count = 0;

int increment()
{
    return ++count; // error, identifier count is ambiguous
}

该错误通常很长且不友好,因为std::count是一个包含一些长嵌套类型的模板。

不过,这是可以的,因为std::count进入全局名称空间,而函数count将其隐藏。

代码语言:javascript
复制
#include <algorithm>
using namespace std;

int increment()
{
    static int count = 0;
    return ++count;
}

也许有点令人惊讶的是,这是可以的。导入到声明性作用域中的标识符出现在公共命名空间中,该命名空间包含了它们的定义位置和导入位置。换句话说,std::count在全局名称空间中以count的形式可见,但仅在increment中可见。

代码语言:javascript
复制
#include <algorithm>

int increment()
{
    using namespace std;
    static int count = 0;
    return ++count;
}

出于类似的原因,count在这里是模棱两可的。using namespace std不会导致std::count,请像预期的那样隐藏外部countusing namespace规则意味着(在increment函数中) std::count看起来好像是在全局范围内声明的,即在与int count = 0;相同的范围内,因此导致了歧义。

代码语言:javascript
复制
#include <algorithm>

int count = 0;

int increment()
{
    using namespace std;
    return ++count; // error ambiguous
}
票数 144
EN

Stack Overflow用户

发布于 2009-08-12 09:07:50

排除基础(如果没有'using namespace std‘,则必须在所有stl对象/函数的前面添加std::并减少冲突的可能性)

同样值得注意的是,您永远不应该将

代码语言:javascript
复制
using namespace std

在头文件中,因为它可以传播到包括该头文件的所有文件,即使它们不想使用该名称空间。

在某些情况下,使用像这样的东西非常有益

代码语言:javascript
复制
using std::swap

如果有一个专门的交换版本,编译器将使用它,否则它将依赖于std::swap

如果调用std::swap,则始终使用基本版本,它不会调用优化版本(如果存在)。

票数 45
EN

Stack Overflow用户

发布于 2009-08-12 09:16:08

如果您的代码中没有名称与std和其他库冲突的风险,您可以使用:

代码语言:javascript
复制
using namespace std;

但是,如果您想准确地了解文档代码的依赖关系,或者存在名称冲突的风险,请使用另一种方法:

代码语言:javascript
复制
using std::string;
using std::cout;

第三个解决方案,不要使用这些解决方案,在每次代码中使用之前编写std::,这会给你带来更多的安全性,但是,代码中可能会有一点繁重……

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1265039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档