Имеет ли std :: endl < У std :: flush есть цель?

9Breaker спросил: 12 мая 2018 в 05:06 в: c++

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;

Но, поскольку многие Senior разработчики программного обеспечения видели этот код на протяжении многих лет, мне интересно, есть некоторые детали, которые мне не хватает. Есть ли какая-либо цель иметь std::flush после std::endl?

3 ответа

Есть решение
Xirema ответил: 12 мая 2018 в 05:11

Для этого нет никакой цели.

Если бы мне пришлось размышлять о том, почему ваш старый код содержит эти строки, есть несколько возможностей, начиная с (что я считаю) наиболее вероятными сценариями:

  • Кто-то добавил ошибочный явный вызов std::flush, и старшие разработчики не рассматривали его как проблему, требующую исправления.
  • Код исходит из до того, как стандарт C ++ был широко принят, и в то время реализация локального компилятора std::endl не вызывала флеш, а это означало, что ваши старшие разработчики (правильно) понимали, что это необходимо.
  • Старая версия стандарта C ++ может не потребоваться std::endl для запуска флеша
  • Ваши старшие разработчики ошибаются в поведении std::endl.
  • Ваша среда исполнения - странный бегемот, который на самом деле требует, чтобы результат был дважды очищен до желаемого результата.
Drew Dormann ответил: 12 мая 2018 в 05:28
Такие глупые вещи могут также появляться, когда текстовый поиск & замена выполняется по исходному коду, например: заменить << '\n' на << std::endl
Arne Vogel ответил: 12 мая 2018 в 07:37
Хороший ответ, но "более старая версия стандарта C ++ ..." - нет, C ++ 98 был первым стандартом, и для этого потребовался flush. В лучшем случае некоторая ранняя версия стандартной библиотеки, возможно, вела себя по-другому, хотя я в этом сомневаюсь. Кстати, я могу придумать причину, по которой они будут использовать endl вместо '\n’, несмотря на то, что не осознают, что это flushes, это система, которая не имеет терминатора LF-линии (скорее всего, Windows) , Конечно, это не обязательно для cout / cerr, а не текстового режима ofstream, а затем еще endl даже не помогает для двоичного ofstream, но это, возможно, было ошибочной аргументацией.
einpoklum ответил: 12 мая 2018 в 05:26

Я добавлю к другим действительным ответам, что очень часто для нет хорошей цели std::flush и std::endl.

В принципе, std::endl = начать новую строку + очистить поток. Многие люди, однако, имеют тенденцию заканчивать свои строки с помощью std::endl, потому что он "звучит правильно" - заканчивает линию. Но на самом деле нам редко нужно очищать выходной поток. Иногда мы это делаем (например, когда мы ожидаем ответа пользователя на строку или важно контролировать наш вывод с минимальной задержкой), но это исключение, а не правило.

Итак, это может потребоваться немного привыкнуть, но мы должны по умолчанию просто:

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

и вот что!

nobar ответил: 12 мая 2018 в 11:47
Да! Используйте std::cerr, если вам нужен вывод, который нужно сбросить на терминал.
NPE ответил: 12 мая 2018 в 05:10

В среде, совместимой со стандартами, std::flush не служит никакой полезной цели в этом коде.

Тот, кто написал это, не полностью понял семантику std::endl, или работали над некоторыми ограничениями их компилятора или среды выполнения.