Что говорит стандарт о диапазоне основных возвратных значений? Скажите только до 255?
Потому что
int main(void){
return 256;
}
echo $? ; # out 0
Что говорит стандарт о диапазоне основных возвратных значений? Скажите только до 255?
Потому что
int main(void){
return 256;
}
echo $? ; # out 0
В стандарте не говорится. 0
, EXIT_SUCCESS
и EXIT_FAILURE
имеют (вид) указанные значения. Все остальное зависит от реализации.
В настоящее время большинство систем на основе Unix поддерживают только 8-битные возвращаемые значения. Windows поддерживает (по крайней мере) 32-битное возвращаемое значение. Я не проверял, поддерживает ли 64-разрядная Windows 64-битное возвращаемое значение, но я скорее сомневаюсь в этом, поскольку даже 64-разрядная Windows обычно по-прежнему использует 32-битный int.
Как утверждали другие, стандарты 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 кажется безопасным.
Коды выхода - это число от 0 до 255 включительно в системе Unix. Вы можете вернуть что угодно, но в Linux он изменил 256. Просмотрите здесь для хорошего объяснения кода возврата Linux. Существует также статья Википедии по теме, в которой говорится о кодах выхода для Windows.
В Unix системный вызов wait устанавливает значение статуса типа int, упакованное как битовое поле с различными типами детей информация о завершении. Если ребенок прекращается путем выхода (как определено макросом WIFEXITED; обычно альтернативой тому, что он умер от неотображаемый сигнал), SUS указывает, что нижние 8 бит значения статуса содержать статус выхода; Это может извлекаться с помощью WEXITSTATUS макрос в wait.h. Таким образом, на Unix статусы выхода ограничены значениями 0-255, диапазон 8-разрядного беззнакового целое число.
Unix-подобные системы обычно используют условное ноль для успеха и не нуль для ошибки. Некоторые соглашения разработали относительно относительного значения различных кодов ошибок; для Пример GNU рекомендует, чтобы коды с набор высоких бит должен быть зарезервирован для серьезные ошибки и FreeBSD документировал обширный набор предпочтительные интерпретации.
Стандарт C99 определяет только 0 и 1. Однако позволяет использовать другие значения.
Подробнее см. Статус выхода.
Стандарт 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
, это сломает много кода).
GetExitCodeProcess
зарезервирован для возврата этого значения, это DWORD *
. Вы возвращаете тип int
. Вы должны иметь возможность вернуть любое значение, которое может быть сохранено в int
. Точный размер int
зависит от реализации, поэтому я не могу дать вам точный диапазон.
5.1.2.2.3 Окончание программы 1 Если тип возврата основной функции является тип, совместимый с int, возврат от первоначального вызова до основного функция эквивалентна вызову exit с возвращенным значением основной функцией в качестве аргумента; 10), достигая}, который завершает основная функция возвращает значение 0. Если тип возврата несовместим с int, возвращается статус завершения в среду хоста не задано
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf
т.е. нет необходимости возвращать что-либо. Однако он полностью утверждает, что это обычные определения. Почти подразумевая, что они являются стандартными, но имеют выход из бесплатной карты, что означает, что это может быть что угодно.