std::endl << std::flush 有目的吗?
Does std::endl << std::flush have a purpose?
std::flush
就在 std::endl
用于我正在查看的遗留代码之后。当我第一次看到这个时,我的想法是查看 std::endl
和 std::flush
的描述是多余的:
http://en.cppreference.com/w/cpp/io/manip/endl
http://en.cppreference.com/w/cpp/io/manip/flush
这是我在遗留源代码中看到的示例:
std::cout << "Generic Notification" << std::endl << std::flush;
但是,多年来许多 高级 软件开发人员都看过这段代码,我想知道我是否遗漏了一些细节。在 std::endl
之后添加 std::flush
有什么意义吗?
在符合标准的环境中,std::flush
在此代码中没有用处。
写这篇文章的人要么没有完全理解 std::endl
的语义,要么正在解决他们的编译器或执行环境的某些限制。
没有目的。
如果我不得不推测为什么您的遗留代码包含这些行,有几种可能性,从(我认为的)最可能的场景开始:
- 有人错误地添加了对
std::flush
的显式调用,高级开发人员认为这不是需要修复的问题
- 该代码源自 C++ 标准被广泛采用之前的时间,当时本地编译器对
std::endl
的实现没有触发刷新,这意味着您的高级开发人员(正确)理解这是必要的
- 旧版本的 C++ 标准可能不需要
std::endl
触发刷新
- 您的高级开发人员对
std::endl
的行为有误。
- 您的执行环境是一个奇怪的庞然大物,实际上需要刷新两次输出才能获得预期的结果。
我会在其他有效答案中补充一点,通常 std::flush
或 std::endl
都没有好的目的。
基本上,std::endl
= 开始一个新行 + 刷新流。但是,很多人倾向于以 std::endl
结束他们的行,因为它 "sounds right" - 结束行。但我们实际上很少需要刷新输出流。有时我们会这样做(例如,当我们期待用户对字符串的回复时,或者以最小的延迟监控我们的输出很重要)——但这是例外,而不是规则。
所以,这可能需要一些时间来适应,但我们应该默认为简单:
std::cout << bunch_of_stuff << '\n';
就是这样!
std::flush
就在 std::endl
用于我正在查看的遗留代码之后。当我第一次看到这个时,我的想法是查看 std::endl
和 std::flush
的描述是多余的:
http://en.cppreference.com/w/cpp/io/manip/endl
http://en.cppreference.com/w/cpp/io/manip/flush
这是我在遗留源代码中看到的示例:
std::cout << "Generic Notification" << std::endl << std::flush;
但是,多年来许多 高级 软件开发人员都看过这段代码,我想知道我是否遗漏了一些细节。在 std::endl
之后添加 std::flush
有什么意义吗?
在符合标准的环境中,std::flush
在此代码中没有用处。
写这篇文章的人要么没有完全理解 std::endl
的语义,要么正在解决他们的编译器或执行环境的某些限制。
没有目的。
如果我不得不推测为什么您的遗留代码包含这些行,有几种可能性,从(我认为的)最可能的场景开始:
- 有人错误地添加了对
std::flush
的显式调用,高级开发人员认为这不是需要修复的问题 - 该代码源自 C++ 标准被广泛采用之前的时间,当时本地编译器对
std::endl
的实现没有触发刷新,这意味着您的高级开发人员(正确)理解这是必要的 - 旧版本的 C++ 标准可能不需要
std::endl
触发刷新 - 您的高级开发人员对
std::endl
的行为有误。 - 您的执行环境是一个奇怪的庞然大物,实际上需要刷新两次输出才能获得预期的结果。
我会在其他有效答案中补充一点,通常 std::flush
或 std::endl
都没有好的目的。
基本上,std::endl
= 开始一个新行 + 刷新流。但是,很多人倾向于以 std::endl
结束他们的行,因为它 "sounds right" - 结束行。但我们实际上很少需要刷新输出流。有时我们会这样做(例如,当我们期待用户对字符串的回复时,或者以最小的延迟监控我们的输出很重要)——但这是例外,而不是规则。
所以,这可能需要一些时间来适应,但我们应该默认为简单:
std::cout << bunch_of_stuff << '\n';
就是这样!