Вопрос по standards, c++, return, main – Почему возвращаемое по умолчанию значение main равно 0, а не EXIT_SUCCESS?

21

Стандарт ISO 1998 c ++ указывает, что неявное использование оператора возврата в основном эквивалентно использованиюreturn 0. But what if an implementation has a different standard "no error" code, for example -1?

Почему бы не использовать стандартный макросEXIT_SUCCESS это будет заменено либо0 или же-1 или любое другое значение в зависимости от реализации?

C ++, кажется, усиливает семантику программы, а не роль языка, который должен только описывать поведение программы. Более того, ситуация с «ошибкой» иная. возвращаемое значение: толькоEXIT_FAILURE является стандартной «ошибкой» флаг завершения, без явного значения, такого как "1" например.

Каковы причины этого выбора?

Ваш Ответ

9   ответов
0

Если бы вы также подумали о том, почему код ошибки для успеха равен 0, а не какому-либо другому значению, я бы добавил, что это могло быть исторически из соображений производительности, поскольку сравнение с 0 было заметно быстрее (я думаю, что в современных архитектурах как и с любым числом), и обычно вы не проверяете конкретный код ошибки, просто если это был успех или какая-либо ошибка (поэтому имеет смысл использовать для этого самое быстрое сравнение).

Это правда, но это не противоречит тому, что я сказал. Если ERROR_SUCCESS был 1 (или любой другой), у вас все еще есть все другие числа, чтобы указать различные виды сбоев.
Я не думаю, что это является причиной использования 0 в качестве индикатора успеха - я полагаю, что причина в том, что обычно существует более одного способа отказа, поэтому требуется более одного кода ошибки.
5

Стандарт просто определяет, каким должно быть значение, если оно не установлено явно. Разработчики должны либо явно установить возвращаемое значение, либо принять подходящую семантику по умолчанию. Я не думаю, что язык пытается навязать разработчикам какую-либо семантику.

Значение по умолчанию должно определяться не уровнем c ++, а системой. Например, если программа впервые написана на c ++, «0» будет стандартным кодом успеха; затем, если он переписан на другом языке, для которого "1" это стандартный код успеха по умолчанию, он нарушает поведение других программ / пользователей, которые его используют. Принимая во внимание, что если на двух языках есть макрос EXIT_SUCCESS, который будет управляться хост-системой, все будет работать нормально. Макрос будет заменен компилятором его значением в системе: & quot; 0 & quot; для posix - "1"; для других ... Pragmateek
1

Стандарты компьютерного языка говорят о том, что должна делать программа, написанная на языке, и что произойдет. В этом случае стандарты C и C ++ говорят, что возвращение 0 означает успех, помимо прочего.

Языковые реализации позволяют программам работать на определенных реализациях. Задача разработчика состоит в том, чтобы выяснить, как заставить работать ввод-вывод в соответствии со стандартом, или дать ОС правильный код результата.

То, что делает программа и то, что видит ОС, не обязательно должно совпадать. Все, что нужно, - это то, что программа работает так, как говорит стандарт на данной ОС.

3

0 в качестве кода возврата для успеха, а положительные целые числа в качестве ошибок - это стандарт в C и Unix. что обычно не волнует, почему программаsucceededПросто так оно и было. С другой стороны, существует множество способов сбоя программы с ошибкой, и каждый часто интересуется этой информацией. Следовательно, имеет смысл использовать скалярное значение для успеха и диапазон значений для ошибки. Использование положительных целых чисел - это соглашение C, позволяющее экономить память, поскольку оно позволяет определять код ошибки как беззнаковое целое.

18

На самом деле,return 0 не вернет 0! Я цитирую стандарт C здесь, потому что это то, что я знаю лучше всего.

Околоreturn вmain():

5.1.2.2.3 Program termination

If the return type of the main function is a type compatible with int, a return from the initial call to the main function is equivalent to calling the exit function with the value returned by the main function as its argument;

Околоexit():

7.20.4.3 The exit function
Synopsis

#include <stdlib.h>
void exit(int status);

[...]
Finally, control is returned to the host environment. If the value of status is zero or EXIT_SUCCESS, an implementation-defined form of the status successful termination is returned.

Откуда вы видите такой конфликт? Компилятор несет ответственность за его работу. Самый простой способ - это #define EXIT_SUCCESS 0, но это только один вариант.
@Bastien: Спасибо, ваши комментарии завершают объяснение Майкла. Pragmateek
Всегда приятно видеть, что кто-то объясняет стандарт в понятной форме. Тем не менее, возможность выбора между буквальным нулем и EXIT_SUCCESS эквивалентна использованию двух, возможно, противоречивых определений. Правильно ли я так думаю?
2

OS / 360 и преемники используют числовой код завершения,0 обычно это успех,4 для предупреждений (например, компилятор, который сгенерировал предупреждающее сообщение),8 за ошибку и12 за особо плохие ошибки (например, невозможность открыть SYSPRINT, стандартный блок вывода).

Интересная историческая справка. Pragmateek
4

0 - это стандартный (успешный) код завершения во всех системах POSIX и во всех системах, которые я знаю! Я думаю, что так было с самого начала (или, по крайней мере, с тех пор, как это сделал Unix ...). Так что по этой причине я бы сказал.

Какую систему вы знаете, что отличается?

«EXIT_STATUS может иметь значение, отличное от 0, и фактически он имел значение для VAX / VMS в один момент времени»: взято изbytes.com/groups/c/215177-exit_success-guaranteed-always-zero
Это правда, что "0" поскольку флаг успеха является «де-факто» стандарт. Но, сделав его стандартом для c ++, вынуждает хост-системы использовать его для того, чтобы быть «iso-совместимым». реализация. Принимая во внимание, что использование стандартной константы, такой как EXIT_SUCCESS, гарантирует, что семантика "все в порядке" не связана с деталями реализации, "0 означает успех, 1 сбой ...". Pragmateek
ИМХО, это не проблема: если они былиsystem предпочитая другое значение, аlanguage Определяя, какое было успешное возвращаемое значение, это привело бы к конфликту языков в этой системе. Кроме того, вы не можете доказать теорему, приводя примеры.
1

Просматриваяcstdlib Я закончил с двумя строками:

#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1

ТакEXIT_SUCCESS равняется0, а такжеEXIT_FAILURE равняется1, что означает, что это не имеет значения, мысль.

Проверено в Linux (OpenSuse) и закончилось тем же.

Чтобы быть педантичным: эти определения предназначены только для вашей платформы, другая платформа может использовать другое соглашение; хотя я думаю, что они теперь универсальны. :) Pragmateek
@Pragmateek Конечно, это так. Этот код взят из Windows, но я думаю, что он одинаков для Linux. Однако я буду читать из Linux и Android, и мы увидим, чем я закончу.
34

Возвращая ноль изmain() делает то же самое, что вы просите. Возвращая ноль изmain() не должен возвращать ноль в среду хоста.

Из стандартного документа C90 / C99 / C ++ 98:

If the value of status is zero or EXIT_SUCCESS, an implementation-defined form of the status successful termination is returned.

@Serious - помните, что конкретная среда может даже не использовать числовые коды возврата так же, как в Unix. Я был бы удивлен, если бы были какие-либо вещи, которые не являются более или менее просто курьезами сегодня, но, например, я, честно говоря, не знаю, что происходит в среде мэйнфреймов, которая использует JCL для контроля выполнения программы.
Очень интересно, что это означает, что стандарт c ++ не заставляет хост «успешно использовать код». Так что возвращаем & quot; 0 & quot; из программы на c ++ не гарантирует, что хост-система получит «0» и означает, что поведение оператора возврата c ++ может отличаться от указанного программистом: & quot; возвращать 0 & quot; может быть в реализации "заменен" "вернем 1" ? Pragmateek
@ Серьезно: но чтобы ответить на ваш вопрос более прямо - если среда выполнения программы ожидает, что 1 означает успешное выполнение, а 0 означает неудачу, то "возвратит 0" из main (), вероятно, следует установить код выхода программы равным 1. И & quot; возвратить EXIT_FAILURE & quot; Вероятно, следует установить код завершения программы равным 0. Но я ожидаю, что эти среды будут довольно редкими, поскольку интерпретация 0 в C и Unix как успешная была весьма влиятельной.
Другими словами, ноль иEXIT_SUCCESS являются эквивалентными возвращаемыми значениями, поэтому не имеет значения, какой стандарт требуется вернуть по умолчанию.
просто чтобы уточнить, что указано для функции exit (), а в состояниях 3.6.1: 5 эффект возврата из main состоит в том, чтобы выйти из main и затем вызвать exit (). Так что да, ты прав. :)

Похожие вопросы