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


当前回答

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

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

其他回答

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

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

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

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

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

另一个原因是惊讶。

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

考虑两个名为Foo和Bar的库:

using namespace foo;
using namespace bar;

一切都很好,你可以从Foo调用Blah(),从Bar调用Qux()。但有一天你升级到了Foo 2.0的新版本,它现在提供了一个名为Qux()的函数。现在出现了一个冲突:Foo 2.0和Bar都将Qux()导入到全局命名空间中。这将需要一些努力来解决,特别是如果函数参数恰好匹配。

如果您使用了foo::Blah()和bar::Qux(),那么引入foo::Qux()将是一个非事件。

这是一种糟糕的做法,通常被称为全局命名空间污染。当多个名称空间具有相同的函数名和签名时,可能会出现问题,那么编译器决定调用哪个名称空间是不明确的,当您使用std::cout这样的函数调用指定名称空间时,这一切都可以避免。希望这有帮助。:)

老实说,对我来说,这就像讨论缩进空间的数量。

在标头中使用指令会导致损坏。但是在C++文件中呢?如果同时使用两个名称空间,可能会发生这种情况。但如果你使用一个,它更多的是风格而不是真正的效率。

你知道为什么关于缩进的线索如此流行吗?任何人都可以说些什么,听起来非常聪明和有经验。