std :: endl << std :: flush有目的吗?

9Br*_*ker 9 c++ flush endl

std::flush就在std::endl我正在查看遗留代码的所有内容之后.当我第一次看到这个,我的想法是这是在看的描述冗余std::endlstd::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;
Run Code Online (Sandbox Code Playgroud)

但是,由于许多高级软件开发人员多年来都看过这个代码,我想知道是否有一些我遗漏的细节.有没有任何目的有一个std::flushstd::endl

Xir*_*ema 11

它没有任何目的.

如果我不得不推测为什么遗留代码包含这些行,那么有一些可能性,从(我认为是)最可能的场景开始:

  • 有人std::flush错误地添加了明确的调用,而高级开发人员并不认为这是一个需要修复的问题
  • 代码源于C++标准被广泛采用之前的一段时间,并且在那个时候,本地编译器的实现std::endl没有触发刷新,这意味着您的高级开发人员(正确地)理解它是必要的
  • 旧版本的C++标准可能不需要std::endl触发刷新
  • 你的高级开发人员误解了他们的行为std::endl.
  • 您的执行环境是一个奇怪的庞然大物,实际上需要在预期的结果之前刷新两次输出.

  • 当在源代码上执行文本搜索和替换时,也会出现这样的傻事,例如:将`<<'\n'`替换为`<< std :: endl` (4认同)
  • 很好的答案,但"旧版本的C++标准......" - 不,C++ 98是第一个标准,它确实需要`flush`.最好的情况是,标准库的某些早期版本可能表现不同,但我对此表示怀疑.顺便说一句,我可以想到为什么他们会使用`endl`而不是`'\n'而不知道它是否刷新的原因,这是一个没有LF线路终结器的系统(很可能是Windows).当然这对`cout` /`cerr`来说不是必需的,也不是文本模式`ofstream`,然后`endl`甚至不能帮助二进制`ofstream`,但这可能是错误的推理. (2认同)

ein*_*ica 6

我将添加到其他有效的答案,很多时候,没有一个良好的目的,要么 std::flushstd::endl

基本上,std::endl=开始一个新行+刷新流。但是,很多人倾向于用std::endl“听起来不错”来结束他们的台词——结束台词。但是我们实际上很少需要刷新输出流。有时我们会这样做(例如,当我们期待用户对字符串的回复时,或者以最小延迟监控我们的输出很重要时) - 但这是例外,而不是规则。

所以,可能需要一点时间来适应,但我们真的应该默认为简单的:

std::cout << bunch_of_stuff << '\n';
Run Code Online (Sandbox Code Playgroud)

就是这样!


NPE*_*NPE 5

在符合标准的环境中,std::flush此代码中没有任何用处.

写这篇文章的人要么没有完全理解其语义std::endl,要么正在解决其编译器或执行环境的某些限制.