Должна ли функция int main() возвращать значение во всех компиляторах?
Почему нет необходимости включать оператор return при использовании int main() в некоторых компиляторах для C++? Что насчет Turbo C++?
7 ответов
В C++, а также в C99 и C11 специальным правилом языка является то, что если поток управления достигает конца main
функция, затем функция Impliclty возвращает 0
,
В C++ и C99/C11 без оператора возврата в основной функции по умолчанию возвращается 0;
§ 3.6.1 Основная функция
Оператор return в main приводит к выходу из функции main (уничтожению любых объектов с автоматическим хранением) и вызову std::exit с возвращаемым значением в качестве аргумента. Если элемент управления достигает конца main, не встречая оператора return, результатом является выполнение return 0;
также прочитайте вики-страницу C/C++ основная функция
В случае, если возвращаемое значение не определено программистом, неявное возвращение 0; в конце функция main() вставляется компилятором; такое поведение требуется стандартом C++.
main
должен вернуть int
некоторые компиляторы, включая Turbo C++, могут разрешать другие возвращаемые значения, особенно void main
, но это неправильно, никогда не используйте это.
Однако в C++, если вы явно не возвращаете значение в main
это так же, как return 0;
C++11 §3.6.1 Раздел 5 основных функций
Оператор return в main приводит к выходу из функции main (уничтожению любых объектов с автоматическим хранением) и вызову std::exit с возвращаемым значением в качестве аргумента. Если управление достигает конца main, не встречая оператора return, эффект заключается в выполнении
return 0;
Обратите внимание, что для C это поддерживается только в C99 и более поздних версиях, но не поддерживается в C89.
Стандарт говорит, что main
вернусь 0
если нет return
заявление. Из проекта стандартного раздела C++ 3.6.1
параграф 5
:
Оператор return в main имеет эффект выхода из функции main (уничтожения любых объектов с автоматическим хранением) и вызова std::exit с возвращаемым значением в качестве аргумента. Если управление достигает конца main, не встречая оператора return, эффект заключается в выполнении
return 0;
C99
проект стандарта в разделе 5.1.2.2.3
говорит:
Если возвращаемый тип главной функции является типом, совместимым с int, возврат из начального вызова основной функции эквивалентен вызову функции выхода со значением, возвращаемым главной функцией в качестве аргумента;10) достижением}, который завершает основную функцию возвращает значение 0.
Из того, что я могу сказать, последняя версия Turbo C++ довольно старая, и я не могу найти ничего, что определяло бы, какой стандарт он поддерживает.
TC вернет EXIT_SUCCESS, независимо от того, явно вы указали или нет
Кроме соответствия стандарту произвольного языка, нет веских причин возвращать значение, когда основная функция завершается.
Это только потому, что процессы в популярных операционных системах имеют понятие кода возврата для завершившегося процесса. Нетрудно представить операционную систему, в которой им не нужно возвращать какое-либо значение. Вы также можете представить себе мир, в котором 0 неявно возвращается всеми процессами, если не указано иное, в этом случае вы можете делегировать решение о коде возврата системному вызову. (На самом деле, такой системный вызов уже существует в форме функции выхода Си).
Как утверждают другие люди, некоторые компиляторы не требуют от вас явного return 0;
Тем не менее, это всегда хорошая идея (если это возможно). Я бы не рекомендовал использовать любой компилятор, который запрещает вам возвращаться из вашей основной функции.
Я хотел бы отметить, что возвращаемое значение из int main очень важно и действительно имеет смысл.
Возвращаемое значение из main иногда называется exit status
или же error code
из вашей программы ноль означает, что он успешно завершен. Другие программы и сценарии могут получить доступ к этому коду, чтобы определить, успешно ли завершена ваша программа.
Более подробная информация здесь: http://en.wikipedia.org/wiki/Exit_status