Должен ли я вернуть EXIT_SUCCESS или 0 из main ()? - PullRequest
100 голосов
/ 15 января 2012

Это простой вопрос, но я продолжаю видеть противоречивые ответы: должна ли основная подпрограмма программы на C ++ возвращать 0 или EXIT_SUCCESS?

#include <cstdlib>
int main(){return EXIT_SUCCESS;}

или

int main(){return 0;}

Это одно и то же? EXIT_SUCCESS должен использоваться только с exit()?

Я подумал, что EXIT_SUCCESS будет лучшим вариантом, потому что другое программное обеспечение может захотеть считать ноль отказом, но я также слышал, что если вы вернете 0, компилятор в любом случае сможет изменить его на другое значение.

Ответы [ 9 ]

131 голосов
/ 15 января 2012

EXIT_FAILURE, либо в операторе возврата в main, либо в качестве аргумента exit(), является единственным переносимым способом указать сбой в программе на C или C ++.Например, exit(1) может фактически сигнализировать об успешном завершении в VMS.

Если вы собираетесь использовать EXIT_FAILURE в случае сбоя вашей программы, то вы также можете использовать EXIT_SUCCESS в случае успеха, просторади симметрии.

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

Использование 0 имеет незначительное преимущество, которое вы не делаете.вам нужно #include <stdlib.h> в C или #include <cstdlib> в C ++ (если вы используете оператор return вместо вызова exit()) - но для программы любого значительного размера вы собираетесь включить stdlibпрямо или косвенно в любом случае.

В этом отношении, в C, начиная со стандарта 1999 года, и во всех версиях C ++, достижение конца main() в любом случае подразумевает return 0;, поэтому вам может не понадобитьсяявно использовать 0 или EXIT_SUCCESS.(Но, по крайней мере, в C я считаю явный return 0; лучшим стилем.)

(Кто-то спрашивал об OpenVMS. Я давно не использовал его, но, как я помню, странные значения состоянияобычно обозначает успех, в то время как четные значения обозначают сбой. Реализация C отображает 0 на 1, так что return 0; указывает на успешное завершение. Другие значения передаются без изменений, поэтому return 1; также указывает на успешное завершение. EXIT_FAILURE будет иметьненулевое четное значение.)

24 голосов
/ 15 января 2012

Неважно. Оба одинаковы.

C ++ Стандартные цитаты:

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

9 голосов
/ 15 января 2012

Это бесконечная история, которая отражает пределы (миф) «совместимости и доступности для всех».

То, что программа должна возвратить, чтобы указать «успех», должно быть определено тем, кто получает значение (операционная система или процесс, который вызвал программу), а не спецификацией языка.

Но программистам нравится писать код «переносимым способом», и поэтому они изобретают свою собственную модель для понятия «операционная система», определяющую символьные значения для возврата.

Теперь, в сценарии «многие ко многим» (где многие языки служат для написания программ для многих систем) соответствие между языковым соглашением «успех» и соглашением операционной системы (которое никто не может допустить, чтобы оно всегда было то же самое) должно обрабатываться конкретной реализацией библиотеки для конкретной целевой платформы.

Но, к сожалению, эта концепция не очень ясна в то время, когда язык C был развернут (главным образом для написания ядра UNIX), и гигаграммы книг, в которых написано «возвращение 0 означает успех», поскольку это верно для ОС в то время имела компилятор C.

С тех пор не было четкой стандартизации того, как следует обрабатывать такую ​​корреспонденцию. C и C ++ имеют свое собственное определение «возвращаемых значений», но никто не предоставляет надлежащий перевод ОС (или лучше: ни одна документация компилятора ничего не говорит об этом). 0 означает успех, если верно для UNIX - LINUX и - по независимым причинам - также для Windows, и это охватывает 90% существующих «потребительских компьютеров», что - в большинстве случаев - игнорирует возвращаемое значение (поэтому мы можем обсуждать на протяжении десятилетий, но никто никогда не заметит!)

Внутри этого сценария, прежде чем принять решение, задайте следующие вопросы: - Я заинтересован, чтобы сообщить что-то моему звонящему о моем существовании? (Если я просто всегда возвращаю 0 ... за всем этим нет никакой подсказки) - У моего абонента есть соглашения об этом общении? (Обратите внимание, что одно значение не является соглашением: оно не допускает никакого представления информации)

Если оба ответа отрицательны, вероятно, хорошее решение - вообще не писать основной оператор возврата. (И пусть компилятор сам решит, в отношении цели работает).

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

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

9 голосов
/ 15 января 2012

0, по определению, магическое число. EXIT_SUCCESS почти всегда равен 0, к счастью. Так почему бы просто не вернуться / выйти 0?

Выход (EXIT_SUCCESS); совершенно ясно по смыслу.

Выход (0); с другой стороны, в некоторых отношениях нелогично. Кто-то, не знакомый с поведением оболочки, может предположить, что 0 == false == плохо, как и любое другое использование 0 в C. Но нет - в этом особом случае 0 == success == good. Для большинства опытных разработчиков проблем не возникнет. Но зачем сбивать нового парня без всякой причины?

tl; dr - если есть определенная константа для вашего магического числа, почти никогда нет причины не использовать эту константу в первую очередь. Это удобнее для поиска, часто понятнее и т. Д., И ничего вам не стоит.

4 голосов
/ 15 января 2012

Как только вы начинаете писать код, который может возвращать множество состояний выхода, вы начинаете #define со всех их.В этом случае EXIT_SUCCESS имеет смысл, если не считать " магическое число ".Это делает ваш код более читабельным, потому что любой другой код завершения будет EXIT_SOMETHING.Если вы просто напишите программу, которая вернется, когда все будет готово, return 0 будет действительным и, возможно, даже более чистым, поскольку предполагает отсутствие сложной структуры кода возврата.

0 голосов
/ 23 октября 2016

0 == Ложь && Ложь == EXIT_SUCCESS

На практике я не думаю, что это имеет большое значение.- но Main определяется как int, поэтому логично, что main возвращает int.При некоторых обстоятельствах вы можете захотеть вернуть разные целые числа для разных ошибок, и было бы странно давать одно причудливое имя.

0 голосов
/ 15 января 2012

Некоторые компиляторы могут создавать проблемы с этим - на компиляторе Mac C ++ EXIT_SUCCESS работал хорошо для меня, но на компиляторе Linux C ++ мне пришлось добавить cstdlib, чтобы узнать, что такое EXIT_SUCCESS.Кроме того, они одно и то же.

0 голосов
/ 15 января 2012

Если вы используете EXIT_SUCCESS, ваш код будет более переносимым.

http://www.dreamincode.net/forums/topic/57495-return-0-vs-return-exit-success/

0 голосов
/ 15 января 2012

То, что вы возвращаете из программы - это просто соглашение.

Нет, я не могу вспомнить ни о каких обстоятельствах, когда "EXIT_SUCCESS" не будет быть "0".

Лично я бы порекомендовал "0".

ИМХО ...

...