Есть ли гарантия автоматической очистки stdout перед выходом? Как это работает?

Вот код (действительный C и C ++)

#include <stdio.h>

int main() {
printf("asfd");
// LINE 1
return 0;
}

Если в строке 1 я добавлю выражение segfaulting, программа просто рухнет, ничего не печатая (как и ожидалось).

Но почему вышеприведенный код печатает «asdf» и не завершается без очистки буфера? Что находится под капотом и почему он работает как положено?

10

Решение

Это достигается этими двумя разделами в спецификации языка C ++:

[Basic.start.main]

Заявление о возврате в main имеет эффект выхода из основной функции и вызова exit с возвращаемым значением в качестве аргумента.

а также

[Lib.support.start.term]

Функция exit имеет дополнительное поведение в этом международном стандарте:

  • Затем все открытые потоки C с неписанными буферизованными данными сбрасываются.
18

Другие решения

Как правило, возврат из main это не конец вашей программы и не вход в main начало.

Обычно компоновщик, который создает конечный исполняемый файл для вашей программы, отмечает некоторое местоположение, возможно, с именем start, как место, где начинается казнь. Когда операционная система загружает вашу программу и начинает выполнять ее, она начинает выполнение с этого места. Там есть код, который устанавливает среду: создает стек, устанавливает состояния потока и так далее. Тогда этот код вызывает main,

когда main возвращается, он возвращается к этому специальному коду. Затем этот код выполняет различную работу по очистке, которая требуется в конце программы на C или C ++, как описано в этот ответ.

Если программа внезапно завершается, этот окончательный код может не выполняться.

2

когда main() выходы, все открытые потоки закрыты … включить stdout, Закрытие открытого потока stdout и то, что вы записали в буфер, передается с новой строкой или без нее.

1
По вопросам рекламы [email protected]