Выполняет ли exit () что-то особенное, что не делает return?
В некоторых компиляторах для необычных платформ exit()
может переводить свой аргумент в значение выхода вашей программы, в то время как возврат из main()
может просто передавать значение непосредственно в среду хоста без перевода.
Стандарт требует идентичного поведения в этих случаях (в частности, он говорит, что возвращение чего-то, что является int
-совместимым из main()
, должно быть эквивалентно вызову exit()
с этим значением). Проблема в том, что разные ОС имеют разные соглашения для интерпретации выходных значений. Во многих (МНОЖЕ!) Системах 0 означает успех, а все остальное - неудача. Но, скажем, в VMS нечетные значения означают успех, а четные - неудачу. Если вы вернули 0 из main()
, пользователь VMS увидит неприятное сообщение о нарушении доступа. На самом деле не было нарушения прав доступа - это было просто стандартное сообщение, связанное с кодом ошибки 0.
Затем появился ANSI и благословил EXIT_SUCCESS
и EXIT_FAILURE
как аргументы, которые вы могли бы передать exit()
. Стандарт также гласит, что exit(0)
должен вести себя идентично exit(EXIT_SUCCESS)
, поэтому большинство реализаций определяют от EXIT_SUCCESS
до 0
.
Стандарт, следовательно, ставит вас в тупик в VMS, поскольку не оставляет стандартного способа вернуть код ошибки , который имеет значение 0.
Поэтому компилятор VAX / VMS C начала 1990-х годов не интерпретировал возвращаемое значение из main()
, а просто возвращал любое значение в среду хоста. Но если бы вы использовали exit()
, он бы сделал то, что требовал стандарт: перевести EXIT_SUCCESS
(или 0
) в код успеха и EXIT_FAILURE
в общий код ошибки. Чтобы использовать EXIT_SUCCESS
, у вас было , чтобы передать его exit()
, вы не могли вернуть его из main()
. Я не знаю, сохранили ли такое поведение более современные версии этого компилятора.
Портативная программа на С, похожая на эту:
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("Hello, World!\n");
exit(EXIT_SUCCESS); /* to get good return value to OS */
/*NOTREACHED*/ /* to silence lint warning */
return 0; /* to silence compiler warning */
}
В сторону: Если я правильно помню, соглашение VMS для выходных значений более нюансировано, чем нечетное / четное. На самом деле он использует что-то вроде младших трех битов для кодирования уровня серьезности. В целом, однако, уровни нечетной серьезности указывают на успех или различную информацию, а четные указывают на ошибки.