我听说过使用名称空间std;这是不好的做法,我应该直接使用std::cout和std::cin。这是为什么?声明与std命名空间中的某个变量同名的变量是否有风险?


当前回答

我认为本地或全球使用应取决于应用程序。

因为,当我们在本地使用库时,有时代码会变得一团糟。可读性将下降。

因此,只有在可能发生冲突时,我们才应该在本地使用库。

我不是一个更有经验的人。所以,如果我错了,请告诉我。

其他回答

#include <iostream>

using namespace std;

int main() {
  // There used to be
  // int left, right;
  // But not anymore

  if (left != right)
    std::cout << "Excuse me, WHAT?!\n";
}

那么,为什么?因为它引入了与常用变量名重叠的标识符,并允许编译此代码,将其解释为if(std::left!=std::right)。

PVS Studio可以使用V1058诊断程序找到这样的错误:https://godbolt.org/z/YZTwhp(谢谢Andrey Karpov!!)。

Ping cppcheck开发人员:您可能希望标记此项。这是一场灾难。

根据我的经验,如果你有多个库使用cout,但出于不同的目的,你可能会使用错误的cout。

例如,如果我键入,使用名称空间std;并使用命名空间otherlib;如果只键入cout(恰好两者都有),而不是std::cout(或'otherlib::cout'),则可能会使用错误的一个,并出现错误。使用std::cout更有效。

很高兴看到代码并知道它做什么。如果我看到std::cout,我知道这是std库的cout流。如果我看到cout,我不知道。它可能是std库的cout流。或者有一个int cout=0;在同一函数中高出十行。或该文件中名为cout的静态变量。它可能是任何东西。

现在以一百万行代码库为例,它不是特别大,你正在搜索一个bug,这意味着你知道在这一百万行代码中有一行没有完成它应该做的事情;可以读取名为cout的静态int,将其向左移动一位,然后丢弃结果。要找bug,我必须检查一下。你能看出我真的更喜欢看std::cout吗?

如果你是一名教师,并且从未以编写和维护代码为生,那么这是一个非常好的主意。我喜欢看到代码:(1)我知道它做什么;而且,(2)我相信写它的人知道它的作用。

不应该在全局范围内使用using指令,尤其是在头中。但是,在某些情况下,即使是在头文件中,也会出现这种情况:

template <typename FloatType> inline
FloatType compute_something(FloatType x)
{
    using namespace std; // No problem since scope is limited
    return exp(x) * (sin(x) - cos(x * 2) + sin(x * 3) - cos(x * 4));
}

这比显式限定(std::sin,std::cos…)更好,因为它更短,并且能够处理用户定义的浮点类型(通过依赖于参数的查找(ADL))。

另一个原因是惊讶。

如果我看到cout<<blah,而不是std::cout<<blah,我会想:这是什么cout?这是正常的服装吗?有什么特别的吗?