Диапазон возвращаемых значений основной функции

Что говорит стандарт о диапазоне основных возвратных значений? Скажите только до 255?

Потому что

int main(void){
return 256;
}
echo $? ;  # out 0

Ответы

Ответ 1

В стандарте не говорится. 0, EXIT_SUCCESS и EXIT_FAILURE имеют (вид) указанные значения. Все остальное зависит от реализации.

В настоящее время большинство систем на основе Unix поддерживают только 8-битные возвращаемые значения. Windows поддерживает (по крайней мере) 32-битное возвращаемое значение. Я не проверял, поддерживает ли 64-разрядная Windows 64-битное возвращаемое значение, но я скорее сомневаюсь в этом, поскольку даже 64-разрядная Windows обычно по-прежнему использует 32-битный int.

Ответ 2

Как утверждали другие, стандарты C и С++ не ограничивают возвращаемые значения вообще, кроме как утверждать, что (1) main возвращает int (который имеет определенный размер реализации) и (2) ноль (или EXIT_SUCCESS) является успешным возвратом, а EXIT_FAILURE является неудачным возвратом. Он указывает, что a main, который явно не возвращает значение, обрабатывается так, как если бы он возвращал нуль.

В этом случае интерпретация возвращаемого значения зависит от вызывающего (чего-то из семейства wait). POSIX указывает, что только младшие восемь бит возвращаемого значения должны быть доступны для ожидающего родительского процесса. После выключения подпроцесса кто-то вызывает wait для сна до тех пор, пока процесс разветвления не завершится (например, возвращается с main, вызывает exit или abort или что-то еще). Функция wait возвращает статус с помощью указателя на целое число. Вызывающий абонент извлекает фактический статус выхода с помощью макросов WIFEXITED(status_val) и WEXITSTATUS(status_val). Последний определяется POSIX и должен возвращать младшие 8 бит аргумента статуса.

В принципе, значения статуса выхода находятся в глазу наблюдателя. Спецификации ANSI/ISO являются открытыми. Стандарт POSIX определяет значение как восьмибитное количество хотя это дополнительно ограничено, как описано в posix_spawn. Оболочки имеют привычку дальнейшего ограничения значений результата. FWIW, большинство людей согласны с тем, что ограничение возвращаемых значений ниже 64 кажется безопасным.

Ответ 3

Коды выхода - это число от 0 до 255 включительно в системе Unix. Вы можете вернуть что угодно, но в Linux он изменил 256. Просмотрите здесь для хорошего объяснения кода возврата Linux. Существует также статья Википедии по теме, в которой говорится о кодах выхода для Windows.

Ответ 4

В Unix системный вызов wait устанавливает значение статуса типа int, упакованное как битовое поле с различными типами детей информация о завершении. Если ребенок прекращается путем выхода (как определено макросом WIFEXITED; обычно альтернативой тому, что он умер от неотображаемый сигнал), SUS указывает, что нижние 8 бит значения статуса содержать статус выхода; Это может извлекаться с помощью WEXITSTATUS макрос в wait.h. Таким образом, на Unix статусы выхода ограничены значениями 0-255, диапазон 8-разрядного беззнакового целое число.

Unix-подобные системы обычно используют условное ноль для успеха и не нуль для ошибки. Некоторые соглашения разработали относительно относительного значения различных кодов ошибок; для Пример GNU рекомендует, чтобы коды с набор высоких бит должен быть зарезервирован для серьезные ошибки и FreeBSD документировал обширный набор предпочтительные интерпретации.

Стандарт C99 определяет только 0 и 1. Однако позволяет использовать другие значения.

Подробнее см. Статус выхода.

Ответ 5

Стандарт C не налагает особых ограничений на коды выхода, абзац о возвращаемом значении main делегирует в документацию о функции exit(), которая, в свою очередь, говорит:

Если значение статуса равно нулю или EXIT_SUCCESS, возвращается форма завершения успешного завершения статуса. Если значением статуса является EXIT_FAILURE, возвращается форма выполнения неудачного завершения статуса. В противном случае возвращаемый статус определяется реализацией.

который, помимо рекомендаций EXIT_SUCCESS/EXIT_FAILURE, в основном означает "делать то, что вы хотите". :)

Как сказано в одном комментарии, факт, что на системах POSIX фактически рассматриваются только более низкие 8 бит кода выхода, это всего лишь UNIXism, вытекающий из того, как wait syscall (статус выхода должен быть упакован в младшие 8 бит возвращаемого значения wait) и не имеет ничего общего с стандартом C.

Контрпример - это Windows, где рассматривается все значение, переданное на exit/return (если оно не больше, чем DWORD 1 но я не думаю они сделают int больше, чем DWORD, это сломает много кода).


1. Поскольку параметр GetExitCodeProcess зарезервирован для возврата этого значения, это DWORD *.

Ответ 6

Вы возвращаете тип int. Вы должны иметь возможность вернуть любое значение, которое может быть сохранено в int. Точный размер int зависит от реализации, поэтому я не могу дать вам точный диапазон.

Ответ 7

5.1.2.2.3 Окончание программы 1 Если тип возврата основной функции является тип, совместимый с int, возврат от первоначального вызова до основного функция эквивалентна вызову exit с возвращенным значением основной функцией в качестве аргумента; 10), достигая}, который завершает основная функция возвращает значение 0. Если тип возврата несовместим с int, возвращается статус завершения в среду хоста не задано

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf

т.е. нет необходимости возвращать что-либо. Однако он полностью утверждает, что это обычные определения. Почти подразумевая, что они являются стандартными, но имеют выход из бесплатной карты, что означает, что это может быть что угодно.