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


当前回答

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

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

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

其他回答

我最近遇到了关于VisualStudio2010的投诉。事实证明,几乎所有的源文件都有这两行:

using namespace std;
using namespace boost;

许多Boost功能将进入C++0x标准,而Visual Studio 2010有许多C++0x功能,因此这些程序突然无法编译。

因此,避免使用名称空间X;是一种未来校对的形式,一种确保对正在使用的库和/或头文件的更改不会破坏程序的方法。

一个例子是,使用名称空间std会因为计数的模糊性而引发编译错误,这也是算法库中的一个函数。

#include <iostream>
#include <algorithm>

using namespace std;

int count = 1;
int main() {
    cout << count << endl;
}

这里有一个我在其他答案中都没有找到的观点:只使用一个名称空间。根据大多数答案,命名空间不好的主要原因是,你可能会有冲突的函数名,这会导致一片混乱。但是,如果只使用一个名称空间,则不会发生这种情况。确定您将使用最多的库(可能使用名称空间std;)并坚持使用它。

可以认为它有一个不可见的库前缀-std::vector变成了vector。在我看来,这是两全其美的:一方面,它减少了必须进行的键入(正如名称空间所预期的那样),另一方面,为了清晰和安全,它仍然需要使用前缀。如果有一个函数或对象没有名称空间前缀,那么您知道它来自您声明的一个名称空间。

请记住,如果您决定在全球范围内使用一个,请不要在本地使用其他。这又回到了其他答案,即本地名称空间通常比全局名称空间更有用,因为它们提供了各种便利。

有经验的程序员使用任何解决他们问题的方法,避免任何产生新问题的方法。出于这个确切的原因,他们避免使用头文件级别的指令。

经验丰富的程序员也尽量避免在源文件中使用完全限定的名称。这样做的一个次要原因是,除非有充分的理由,否则在代码较少的情况下编写更多的代码是不优雅的。一个主要原因是关闭参数依赖查找(ADL)。

这些好理由是什么?有时程序员明确希望关闭ADL,有时他们希望消除歧义。

因此,以下内容是可以的:

函数级使用指令并在函数的实现中使用声明使用源文件内声明的源文件级别(有时)使用指令的源文件级别

有一个非常简单的答案:这是防御性编程。您知道,使用名称空间std;-可以使std::size_t、std::cout等的使用更容易一些我希望您不必相信这样的指令在标题中没有位置!然而,在翻译单元中,您可能会受到诱惑。。。

作为std命名空间一部分的类型、类等随着每次C++修订而增加。如果放松std::限定符,可能会有太多的歧义。放松std中经常使用的名称的限定符是完全合理的,例如,使用std::fprintf;,或者更可能的是:使用std::size_t;-但是,除非这些已经是语言的很好理解的部分(或者特别是C库的std包装),否则只使用限定符。

当您可以使用typedef并结合自动和decltype推理时,从可读性/可维护性的角度来看,实际上没有什么好处。