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

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

Потому как

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

7 Solutions collect form web for “Диапазон возвращаемых значений основной функции”

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

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

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

В этом случае интерпретация возвращаемого значения зависит от процесса, который ожидает завершения процесса (путем вызова wait , waitpid или waitid ). wait и waitpid – это более старые функции POSIX, и они указывают, что только ожидаемый родительский процесс должен иметь только младшие восемь бит возвращаемого значения . Стандарт POSIX: 2008 добавил waitid как обобщенный метод ожидания, который имеет доступ к полному статусу выхода дочернего процесса.

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

В принципе, значения статуса выхода находятся в поле зрения наблюдателя . Спецификации ANSI / ISO являются открытыми. В пакете POSIX есть несколько способов подождать завершения процесса и получить его статус выхода. POSIX также определяет spawn как более легкую версию exec которой есть собственный набор ограничений на значения статуса выхода. У оболочек есть привычка к дальнейшему ограничению значений результатов – bash GNU ограничивает возвращаемый статус до 7 бит, а shell, совместимая с POSIX, ограничивает значения статуса выхода до 8 бит. FWIW, большинство людей согласны с тем, что ограничение ваших возвращаемых значений будет ниже 64, кажется, безопасным .

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

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

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

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

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

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


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

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

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

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

Дополнительную информацию см. В разделе « Выход из вики».

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

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

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

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

  • GCC с -std = c99 жалуется на незнание struct timespec
  • Автоматически выполняемые функции при загрузке разделяемых библиотек
  • Как перенаправить вывод обратно на экран после freopen («out.txt», «a», stdout)
  • Когда следует использовать mmap для доступа к файлу?
  • Различия между / usr / bin / login и / usr / bin / bash
  • Как выполнить команду и получить вывод команды в C ++ с помощью POSIX?
  • В чем разница между сигмацией и сигналом?
  • Что означает «#define _GNU_SOURCE»?
  • Interesting Posts

    Как разбить строку на слова. Пример: «stringintowords» -> «String Into Words»?

    Как отключить или удалить Microsoft Edge в Windows 10

    VMWare: этот хост не поддерживает VT. Невозможно воспроизвести 64-битную VM из-за отсутствия флага VT

    Регулярное выражение PowerShell разделяется на одно и два пробела

    Как создать экземпляр нестатического внутреннего classа с reflectionм в Java?

    Как установить флаг безопасности в cookie сессии ASP.NET?

    Как получить ввод с клавиатуры в pygame?

    Как измерить производительность диска под Windows?

    Android: создание пользовательских настроек

    Как удалить объекты из массива в Java?

    SimpleDateFormat.parse () игнорирует количество символов в шаблоне

    Поддерживать соотношение сторон по ширине и высоте

    Преобразование строкового представления шестнадцатеричного дампа в массив байтов с использованием Java?

    YouTube не работает через прокси-сервер SSH-туннеля на IP-адрес в США

    Преобразование classов столбцов в data.table

    Давайте будем гением компьютера.