Должна ли функция 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

Другие вопросы по тегам