Почему значение возврата по умолчанию main равно 0, а не EXIT_SUCCESS?
Стандарт ISO 1998 С++ указывает, что явно не использовать оператор return в основном эквивалентно использованию return 0
.
Но что, если в реализации есть другой стандартный код "без ошибок", например -1
?
Почему бы не использовать стандартный макрос EXIT_SUCCESS
, который будет заменен либо на 0
, либо -1
, либо на любое другое значение в зависимости от реализации?
С++, похоже, заставляет семантику программы, которая не является ролью языка, который должен описывать только поведение программы. Кроме того, ситуация отличается от возвращаемого значения "error": только EXIT_FAILURE
является стандартным флагом завершения ошибки, без явного значения, например, "1".
Каковы причины этих выборов?
Ответы
Ответ 1
Возвращаемый ноль из main()
делает по существу то же самое, что и вы. Возврат нуля из main()
не должен возвращать нуль в среду хоста.
Из стандартного документа C90/C99/С++ 98:
Если значение состояния равно нулю или EXIT_SUCCESS
, возвращается форма завершения успешного завершения.
Ответ 2
Собственно, return 0
не обязательно будет возвращать 0! Я цитирую стандарт C здесь, потому что это то, что я знаю лучше всего.
О return
в main()
:
5.1.2.2.3 Окончание программы
Если тип возврата основной функции является типом, совместимым с int
, возврат от начального вызова к функции main
эквивалентен вызову функции exit
со значением, возвращаемым main
функция в качестве аргумента;
О exit()
:
7.20.4.3 Выходная функция
Сводка
#include <stdlib.h>
void exit(int status);
[...]
Наконец, управление возвращается в среду хоста. Если значение status
равно нулю или EXIT_SUCCESS
, форма реализации успешного успешного завершения вернулся.
Ответ 3
Стандарт просто делает определение того, что должно быть значением, если оно явно не задано. Разработчики должны либо явно установить возвращаемое значение, либо принять соответствующую семантику по умолчанию. Я не думаю, что язык пытается заставить любую семантику разработчикам.
Ответ 4
0 является стандартным (успешным) кодом выхода на всех POSIX-системах и всеми системами, которые я знаю! Я думаю, что именно так начиналось искреннее время (или, по крайней мере, с тех пор, как Unix сделала...) Поэтому я по этой причине я бы сказал.
В какой системе вы знаете, что другое?
Ответ 5
0 как код возврата для успеха, а postive integers как ошибки - стандарт в C и Unix. Эта схема была выбрана, потому что обычно неважно, почему программа преуспела, только так она и сделала. С другой стороны, существует множество способов сбой программы с ошибкой, и ее часто интересует эта информация. Следовательно, имеет смысл использовать скалярное значение для успеха и диапазон значений для ошибки. Использование положительных целых чисел - это соглашение о сохранении памяти C, поскольку они позволяют определять код ошибки как unsigned int.
Ответ 6
OS/360 и преемники используют числовой код выхода, 0
обычно имеет успех, 4
для предупреждений (например, компилятор, который генерировал предупреждающее сообщение), 8
для ошибки и 12
для особо плохих ошибки
(например, невозможно открыть SYSPRINT, стандартный блок вывода).
Ответ 7
Стандарты компьютерного языка говорят о том, что должна делать программа, написанная на этом языке, и что произойдет. В этом случае стандарты C и С++ говорят о том, что, между прочим, возвращают 0 сигналов.
Языковые реализации позволяют программам работать на определенных реализациях. Это задача разработчика, чтобы выяснить, как сделать работу ввода-вывода в соответствии со стандартом, или предоставить ОС правильный код результата.
Что делает программа и что видит ОС, не обязательно должно быть одним и тем же. Все, что необходимо, - это то, что программа работает, как говорит стандарт на данной ОС.
Ответ 8
Просмотрев cstdlib
, я получил две строки:
#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
So EXIT_SUCCESS
равно 0
, а EXIT_FAILURE
равно 1
, что означает, что это не имеет значения, подумал.
Проверено на Linux (OpenSuse) и закончилось тем же.
Ответ 9
Если бы вы также подумали о том, почему код ошибки для успеха равен 0 вместо любого другого значения, я бы добавил, что это могло быть исторически по соображениям производительности, поскольку сравнение с 0 было заметно быстрее (я думаю, что в современных архитектурах может быть таким же, как с любым числом), и обычно вы не проверяете конкретный код ошибки, только если это был успех или какая-либо ошибка (поэтому имеет смысл использовать для этого самое быстрое сравнение).