Это простой вопрос, но я продолжаю видеть противоречивые ответы: должна ли основная процедура программы на C ++ возвращаться 0
или EXIT_SUCCESS
?
#include <cstdlib>
int main(){return EXIT_SUCCESS;}
или
int main(){return 0;}
Это одно и то же? Следует использовать EXIT_SUCCESS
только с exit()
?
Я подумал, EXIT_SUCCESS
что это будет лучший вариант, потому что другое программное обеспечение может захотеть посчитать ноль как отказ, но я также слышал, что если вы вернетесь 0
, компилятор в любом случае сможет изменить его на другое значение.
c++
c
return-value
main
Тревор Хики
источник
источник
0
иEXIT_SUCCESS
оба они интерпретируются как успех.Ответы:
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
будет иметь ненулевое четное значение.)источник
0
иEXIT_SUCCESS
не гарантируется, что они будут иметь одинаковое значение (я упомянул об этом в своем ответе), но они оба означают успешное завершение.EXIT_SUCCESS
стилистически лучше, если вы тоже используетеEXIT_FAILURE
, ноexit(0)
это нормально.Не важно. Оба одинаковые.
Стандартные цитаты C ++:
источник
EXIT_SUCCESS == 0
. С другой стороны, для того, чтобы этого не было, нет никаких уважительных причин.0 по определению является магическим числом. EXIT_SUCCESS почти всегда равно 0, к счастью. Так почему бы просто не вернуться / выйти 0?
Выход (EXIT_SUCCESS); совершенно ясен по смыслу.
Выход (0); с другой стороны, в некотором смысле противоречит здравому смыслу. Кто-то, не знакомый с поведением оболочки, может предположить, что 0 == false == плохо, как и любое другое использование 0 в C. Но нет - в этом особом случае 0 == успех == хорошо. Для большинства опытных разработчиков это не проблема. Но зачем сбивать с толку нового парня без всякой причины?
tl; dr - если для вашего магического числа есть определенная константа, почти никогда не бывает причин не использовать эту константу в первую очередь. Он более доступен для поиска, часто более понятен и т. Д., И это вам ничего не стоит.
источник
fclose()
,setvbuf()
, ...), POSIX (listen()
,pthread_create()
,pipe()
, ...), и многие, многие другие библиотеки (например , OpenGL [glGetError()
], Zlib [deflate()
/inflate()
/ ...], SDL [SDL_CreateWindowAndRenderer()
/ ...], и Больше).Это нескончаемая история, отражающая ограничения (миф) «универсальности и мобильности».
То, что программа должна вернуть для обозначения "успеха", должно определяться тем, кто получает значение (операционная система или процесс, вызвавший программу), а не спецификацией языка.
Но программисты любят писать код «переносимым способом», и поэтому они изобретают свою собственную модель концепции «операционной системы», определяющей возвращаемые символические значения.
Теперь, в сценарии «многие ко многим» (где многие языки служат для написания программ для многих систем) соответствие между языковым соглашением об «успехе» и соглашением операционной системы (которое никто не может гарантировать, что он всегда одинаков) должно обрабатываться конкретной реализацией библиотеки для конкретной целевой платформы.
Но, к сожалению, эти концепции были не так ясны в то время, когда был развернут язык C (в основном для написания ядра UNIX), и гигаграммы книг, в которых говорилось, что «return 0 означает успех», поскольку это было верно для ОС в в то время был компилятор C.
С тех пор не было сделано никакой четкой стандартизации того, как следует обрабатывать такое соответствие. В C и C ++ есть собственное определение «возвращаемых значений», но никто не предоставляет правильный перевод ОС (или лучше: никакая документация компилятора ничего не говорит об этом). 0 означает успех, если верно для UNIX - LINUX и - по независимым причинам - также для Windows, и это покрывает 90% существующих "потребительских компьютеров", которые - в большинстве случаев - игнорируют возвращаемое значение (так что мы можем обсуждать десятилетиями, бу никто и не заметит!)
В этом сценарии, прежде чем принимать решение, задайте следующие вопросы: - Интересно ли мне сообщить вызывающему абоненту что-нибудь о моем существовании? (Если я просто всегда возвращаю 0 ... за всем этим нет ключа) - У моего вызывающего абонента есть соглашения об этом общении? (Обратите внимание, что одно значение не является соглашением: оно не допускает представления информации)
Если оба ответа отрицательны, вероятно, хорошее решение - вообще не писать основной оператор возврата. (И пусть компилятор решает, в отношении какой цели работает).
Если нет соглашения, 0 = успех соответствует большинству ситуаций (и использование символов может быть проблематичным, если они вводят соглашение).
Если существуют соглашения, убедитесь, что используются согласованные с ними символические константы (и обеспечьте согласованность соглашений, а не согласованность значений между платформами).
источник
Как только вы начнете писать код, который может возвращать множество статусов выхода, вы начинаете
#define
их все. В этом случаеEXIT_SUCCESS
имеет смысл не быть « магическим числом ». Это делает ваш код более читабельным, потому что любой другой код выхода будетEXIT_SOMETHING
. Если вы просто напишете программу, которая вернется, когда она будет выполнена,return 0
будет правильной и, вероятно, даже более чистой, потому что предполагает отсутствие сложной структуры кода возврата.источник
То, что вы возвращаете из программы, - это просто соглашение.
Нет, я не могу придумать никаких обстоятельств, при которых "EXIT_SUCCESS" не было бы "0".
Лично я бы рекомендовал «0».
ПО МОЕМУ МНЕНИЮ...
источник
0
ложно, и многие функции возвращаются0
при неудаче / ничего не делают.Если вы используете EXIT_SUCCESS, ваш код будет более переносимым.
http://www.dreamincode.net/forums/topic/57495-return-0-vs-return-exit-success/
источник
EXIT_SUCCESS
оба означают успешное завершение.Некоторые компиляторы могут создавать проблемы с этим - на компиляторе Mac C ++ EXIT_SUCCESS работал у меня нормально, но на компиляторе Linux C ++ мне пришлось добавить cstdlib, чтобы он знал, что такое EXIT_SUCCESS. В остальном они одно и то же.
источник
EXIT_SUCCESS
работал без включения одного<stdlib.h>
или<cstdlib>
, его должен прямо или косвенно определять какой-либо другой заголовок. В C ++ стандартные заголовки обычно используются для#include
других стандартных заголовков. Если это компилируется без ошибок:int main() { return EXIT_SUCCESS; }
вероятно, ваш компилятор глючит.