Должен ли я возвращать EXIT_SUCCESS или 0 из main()?

Это простой вопрос, но я вижу конфликтующие ответы: должна ли главная подпрограмма программы на С++ 0 или EXIT_SUCCESS?

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

или

int main(){return 0;}

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

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

Ответ 1

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

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

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

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

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

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

Ответ 2

Это не имеет значения. Оба одинаковы.

Стандартные котировки С++:

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

Ответ 3

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

выход (EXIT_SUCCESS); в изобилии понятен по смыслу.

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

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

Ответ 4

Это бесконечная история, отражающая пределы (миф) "интероперабельности и потенциала по отношению ко всем".

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

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

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

Но - к несчастью - эта концепция, где не было ясно, когда было развернуто на языке C (главным образом для написания ядра UNIX), и гигаграммы книг, где написано "return 0 означает успех", поскольку это верно для OS в это время имеет компилятор C.

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

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

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

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

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

Ответ 5

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

Ответ 6

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

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

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

ИМХО...

Ответ 8

isnt exit_success - это макрос, который определяется как нуль. Хотел бы я вспомнить, где я читаю. Который сказал, что EXIT_SUCCESS делает его более значимым. но в строке оба обработаны так же, как и в заголовочных файлах, EXIT_SUCCESS как Zero.

Ответ 9

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

Ответ 10

Во-первых, я предполагаю, что вы знаете, что main() должен всегда возвращать int.

Во-вторых, когда мы возвращаем значение из main, мы в основном говорим: "Программа была успешно выполнена!"

Однако: большинство операционных систем будут считать return 0; успешным, но некоторые будут искать return 1;, чтобы сказать, что эта программа выполнена успешно!

Теперь EXIT_SUCCESS - это макрос С++, который будет просто удостовериться, что он вернет правильное значение, всегда говоря: "Эта программа была успешно выполнена!"

Надеюсь, что это поможет:)

Ответ 11

0 == False && False == EXIT_SUCCESS

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

Ответ 12

Я не верю, что это ха-ха :)

системно-зависимое интегральное выражение

Zero - это успех в наиболее распространенных оперативных системах, но в других (вроде Solaris, я слышал, что пару лет назад ха-ха) не является кодом успеха выхода, хорош для Windows * и GNU/LINUX, но лучше используйте этот макрокоманд, отличный от нуля.

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