Почему значение возврата по умолчанию 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 было заметно быстрее (я думаю, что в современных архитектурах может быть таким же, как с любым числом), и обычно вы не проверяете конкретный код ошибки, только если это был успех или какая-либо ошибка (поэтому имеет смысл использовать для этого самое быстрое сравнение).