c++ std::endl〈〈std::刷新是否有目的?

uajslkp6  于 2023-01-28  发布在  其他
关注(0)|答案(3)|浏览(201)

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;

但是,由于许多高级软件开发人员多年来都见过这段代码,我想知道我是否遗漏了一些细节。在std::endl之后有std::flush有什么意义吗?

shyt4zoc

shyt4zoc1#

它没有任何意义。
如果我不得不推测为什么遗留代码包含这些行,有几种可能性,从(我认为的)最可能的场景开始:

  • 有人错误地添加了对std::flush的显式调用,高级开发人员不认为这是需要修复的问题
  • 这段代码起源于C++标准被广泛采用之前的某个时期,在那个时期,本地编译器对std::endl的实现没有触发刷新,这意味着您的高级开发人员(正确地)理解了刷新的必要性
  • 较早版本的C++标准可能不需要std::endl来触发刷新
  • 您的高级开发人员误解了std::endl的行为。
  • 您的执行环境是一个奇怪的庞然大物,实际上需要刷新输出两次才能得到预期的结果。
9w11ddsr

9w11ddsr2#

我将在其他有效答案的基础上补充一点,即通常情况下,* std::flushstd::endl都没有好的目的。
基本上,std::endl =开始一个新行+刷新输出流。但是,很多人倾向于用std::endl来结束他们的行,因为它"听起来很正确"--结束该行。但是,我们实际上很少需要刷新输出流。有时我们确实需要(例如,当我们期待用户对字符串的回复时,或者重要的是以最小的延迟监控我们的输出)-但这是例外,而不是规则。
因此,可能需要一点时间来适应,但我们真的应该简单地默认为:

std::cout << bunch_of_stuff << '\n';

就这样!

uyhoqukh

uyhoqukh3#

在符合标准的环境中,std::flush在此代码中没有任何用处。
不管是谁写的,要么没有完全理解std::endl的语义,要么是在解决编译器或执行环境的一些限制。

相关问题