【问题标题】:Isn't std::endl redundant?std::endl 不是多余的吗?
【发布时间】:2015-08-30 22:41:19
【问题描述】:

在以下情况下会发生刷新:

  • std::cerr
  • std::cin
  • 程序终止
  • 在许多实现中,标准输出是行缓冲的,这意味着“\n”无论如何都会刷新

所以看起来在大多数常规程序中,std::endl 基本上是不必要的,但它几乎无处不在。

【问题讨论】:

  • 您认为用户需要对\n 无论如何都不会刷新的那些实现做些什么?
  • @user5282870:不,它们并不罕见。基本上任何时候你将调试输出放到 std::cout 中,你都应该使用 std::endl ,这样如果程序在此之后立即崩溃并异常终止,诊断将已经被刷新。
  • 也许您在 std::cerr 上输出了不同的调试信息,并且您正在将流通过管道传输到两个单独的日志文件中,以免使日志格式不可读,并将时间戳记在日志。
  • 没有。当你想要一个\n 并且你想要刷新时,使用std::endl。真的就是这么简单。
  • 那我不明白你为什么要问它是不是多余的。

标签: c++ endl


【解决方案1】:

std::cerr

但是如果我不想写到 stderr 而是写到 stdout 怎么办?

std::cin

但是如果我只想给用户一些状态更新而不想要任何输入呢?

程序终止

如上,如果我想在程序完成之前告诉用户一些事情怎么办?

在许多实现中,标准输出是行缓冲的,这意味着“\n”无论如何都会刷新

但是那些没有的平台呢?无论当前是否存在这样的平台,我都希望我的代码按照标准定义的那样工作,而不是像“嗯,可能在所有实现上都可以”。

如果以上所有都适用(第四点实际上总是适用),您需要“手动”冲洗。如果同花由前三个中的一个处理,则不会。

【讨论】:

  • “我希望我的代码按标准定义的那样工作” 实现特定行为由标准定义。但是我要问的“它是多余的”,“它是由标准定义的”并没有回答这个问题。
  • @user5282870 不,实现特定的行为要么由实现定义,要么根本不定义,而不是由标准定义。该标准仅允许它在某些情况下存在。没有理由仅仅因为您使用的编译器(在那个确切版本中)生成的代码可以满足您的需求,就编写不可移植的代码。
  • 此外,std::endl 是一个很好的习惯用法。那些阅读您的代码的人应该将其理解为“我想在这里输出一个换行符并刷新输出”。如果你只写'\n',它可能(也许)被视为“我需要一个换行符,我不关心刷新”。
  • 我想你很困惑。标准“允许”存在未定义的行为,但不“定义”它。特定于实现的行为来自一组允许的行为,但编译器需要对其进行记录。
  • @user5282870 您应该注意到,“未定义的行为” 是错误的术语。这与您所问的无关。
【解决方案2】:

所以看起来在大多数常规程序中,std::endl 基本上是不必要的,但它几乎无处不在。

不,它不是冗余,因为标准没有强制执行沿'\n' 的刷新。这只是特定于实现的行为,而std::endl 的行为始终是明确定义的。

【讨论】:

  • 唯一直接解决问题的回答,没有自我夸大的绒毛。谢谢。
  • @user5282870 “没有自我夸大的绒毛”好吧,我在其他答案中看不到这么多。我是直的主要原因可能是我在平板电脑上打字有点受限 ;-) ...
猜你喜欢
  • 2018-11-15
  • 2021-01-13
  • 1970-01-01
  • 1970-01-01
  • 2015-04-19
  • 1970-01-01
  • 2016-10-02
  • 1970-01-01
相关资源
最近更新 更多