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


当前回答

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

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

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

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

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

其他回答

我不认为这在任何情况下都是不好的做法,但在使用它时都需要小心。如果你正在编写一个库,你可能应该在命名空间中使用作用域解析运算符,以防止你的库与其他库冲突。对于应用程序级代码,我看不出它有什么问题。

只要在头文件中不使用“using namespace std”,这应该是完全正常的。

如果与say boost有命名冲突,那么在特定的.cpp文件中不使用此语句,但通过在其他文件中的每一行上不重复“std::”十次,仍然可以保存每个人的眼睛和手指。

不幸的是,现在这是一个纯粹的宗教问题,每个人都更容易/更有效地遵循一遍又一遍重复“std::”的既定模式。

这都是关于管理复杂性的。使用名称空间会将您不想要的东西拉进来,因此可能会使调试变得更困难(我说可能)。到处使用std::很难阅读(更多的文本等等)。

马的课程-管理你的复杂性,尽你最大的能力和感觉。

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

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

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

对于不合格的导入标识符,您需要像grep这样的外部搜索工具来查找标识符的声明位置。这使得关于程序正确性的推理更加困难。