Это нескончаемая история, отражающая ограничения (миф) «универсальности и мобильности».
То, что программа должна вернуть для обозначения "успеха", должно определяться тем, кто получает значение (операционная система или процесс, вызвавший программу), а не спецификацией языка.
Но программисты любят писать код «переносимым способом», и поэтому они изобретают свою собственную модель концепции «операционной системы», определяющей возвращаемые символические значения.
Теперь, в сценарии «многие ко многим» (где многие языки служат для написания программ для многих систем) соответствие между языковым соглашением об «успехе» и соглашением операционной системы (которое никто не может гарантировать, что он всегда одинаков) должно обрабатываться конкретной реализацией библиотеки для конкретной целевой платформы.
Но, к сожалению, эти концепции были не так ясны в то время, когда был развернут язык C (в основном для написания ядра UNIX), и гигаграммы книг, в которых говорилось, что «return 0 означает успех», поскольку это было верно для ОС в в то время был компилятор C.
С тех пор не было сделано никакой четкой стандартизации того, как следует обрабатывать такое соответствие. В C и C ++ есть собственное определение «возвращаемых значений», но никто не предоставляет правильный перевод ОС (или лучше: никакая документация компилятора ничего не говорит об этом). 0 означает успех, если верно для UNIX - LINUX и - по независимым причинам - также для Windows, и это покрывает 90% существующих "потребительских компьютеров", которые - в большинстве случаев - игнорируют возвращаемое значение (так что мы можем обсуждать десятилетиями, бу никто и не заметит!)
В этом сценарии, прежде чем принимать решение, задайте следующие вопросы: - Интересно ли мне сообщить вызывающему абоненту что-нибудь о моем существовании? (Если я просто всегда возвращаю 0 ... за всем этим нет ключа) - У моего вызывающего абонента есть соглашения об этом общении? (Обратите внимание, что одно значение не является соглашением: оно не допускает представления информации)
Если оба ответа отрицательны, вероятно, хорошее решение - вообще не писать основной оператор возврата. (И пусть компилятор решает, в отношении какой цели работает).
Если нет соглашения, 0 = успех соответствует большинству ситуаций (и использование символов может быть проблематичным, если они вводят соглашение).
Если существуют соглашения, убедитесь, что используются согласованные с ними символические константы (и обеспечьте согласованность соглашений, а не согласованность значений между платформами).