簡體   English   中英

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

[英]Does std::endl << std::flush have a purpose?

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目的嗎?

它沒有任何目的。

如果我不得不推測為什么遺留代碼包含這些行,那么有一些可能性,從(我認為是)最可能的場景開始:

  • 有人錯誤地添加了對std::flush的顯式調用,而高級開發人員並不認為這是一個需要修復的問題
  • 代碼源於C ++標准被廣泛采用之前的一段時間,並且在那個時候,本地編譯器的std::endl實現沒有觸發刷新,這意味着你的高級開發人員(正確地)理解它是必要的
  • 較舊版本的C ++標准可能不需要std::endl來觸發刷新
  • 您的高級開發人員誤解了std::endl的行為。
  • 您的執行環境是一個奇怪的龐然大物,實際上需要在預期的結果之前刷新兩次輸出。

在符合標准的環境中, std::flush在此代碼中沒有任何用處。

寫這篇文章的人要么沒有完全理解std::endl的語義,要么正在解決其編譯器或執行環境的某些限制。

我將添加到其他有效的答案,很多時候,沒有為任何一個好的目的std::flush也不會std::endl

基本上, std::endl =啟動一個新行+刷新流。 但是,很多人傾向於用std::endl來結束他們的行,因為它“聽起來std::endl ” - 結束了這一行。 但實際上我們很少需要刷新輸出流。 有時我們這樣做(例如,當我們期望用戶對字符串的回復時,或者以最小延遲監視我們的輸出很重要) - 但這是例外,而不是規則。

所以,它可能需要一些習慣,但我們應該默認為:

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

就是這樣!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM