使用 std 命名空间,为什么(或为什么不)我应该在 std:: 前面加上前缀

using std namespace, why (or why not) should I prefix std::?

本文关键字:std 前面 前缀 我应该 为什么不 命名空间 为什么 使用      更新时间:2023-10-16

我是 using namespace std;

那么,编码这个有什么问题呢?

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');

据我所知,我应该每次互换放置"using 命名空间"或前缀 std::,但不能同时放置两者。混合两者有什么缺点?

另外,如何替换上面的代码?这是可以接受的吗?

cin.ignore(numeric_limits<streamsize>::max(), 'n');

using namespace std;

这通常是一个坏主意,除非它在狭窄的范围内使污染远离程序的其余部分。

那么,编码这个有什么问题呢?

没什么;它只是比它需要的更冗长。该名称既可用作任何范围内的限定std::cin,也可用作using转储名称的任何范围内的非限定cin。但我建议不要将标准库的内容转储到任何其他范围内,以避免库名称与我想使用的名称冲突的危险。

混合两者有什么缺点?

您既有命名空间帮助避免的名称污染,也有using帮助避免的可读性较差的限定名称;两者的缺点和两者都没有的优点。

另外,如何替换上面的代码?

正如您所说,如果std的内容已转储到可访问的范围内,cin.ignore(numeric_limits::max(), 'n');将起作用。但我仍然建议摆脱using.

如果您已经努力在函数前面加上std::那么通过拥有using namespace std;实际上一无所获,但是从标准库命名空间中提取所有内容会带来缺点。绝对不要两者兼而有之。也不要using namespace std放在头文件中,因为代码的用户可能不希望这样做。这样做是假设标头的用户没有任何与任何标准库名称冲突的名称,如果不是这种情况,那么这对您的用户来说是一种痛苦。

一般来说,我通常总是在前面加上std::,以确保没有名称冲突。但是,如果您只是想减少键入,则可以显式地输入所需的名称。例如:

 using std::cout;
 cout << "foo";

在这种情况下,您可以通过引入所有内容来减少一些类型,而不会污染命名空间。