Должна ли функция int main () возвращать значение во всех компиляторах?

Почему нет необходимости включать оператор return при использовании int main () в некоторых компиляторах для C ++? А что насчет Turbo C ++?


person ajarmani    schedule 23.08.2013    source источник
comment
AFAIK, Turbo форсирует void main (что недопустимо для C ++) и возвращает вам 0.   -  person chris    schedule 23.08.2013
comment
Я почти уверен, что Turbo C ++ точно соответствует нулю из существующих стандартов C ++. Насколько мне известно, разработка Turbo C ++ была остановлена ​​в 1998 году, когда был выпущен первый стандарт C ++.   -  person Mats Petersson    schedule 23.08.2013
comment
Надеюсь, вы спрашиваете из исторического любопытства, а не потому, что планируете использовать для чего-нибудь компилятор двадцатилетней давности.   -  person Mike Seymour    schedule 23.08.2013


Ответы (7)


В C ++, а также в C99 и C11 это особое правило языка: если поток управления достигает конца функции main, функция неявно возвращает 0.

person Kerrek SB    schedule 23.08.2013
comment
@ H2CO3 как это ужасно? - person Kolyunya; 23.08.2013
comment
@ H2CO3 нет, это не так - person No Idea For Name; 23.08.2013
comment
@Kolyunya Почти как void main(). - person ; 23.08.2013
comment
Может быть, потому, что мало людей знают об этом, но кроме этого, я не вижу особой причины. - person chris; 23.08.2013
comment
@NoIdeaForName Что ж, я ненавижу, когда функция перестает работать. Тот, кто полагается на это в main(), будет делать то же самое в других функциях. - person ; 23.08.2013
comment
@ H2CO3 Я не думаю, что это вообще правда. Кроме того, в подавляющем большинстве других ситуаций компилятор все равно будет жаловаться на это. - person Marc Claesen; 23.08.2013
comment
@ H2CO3 Тот, кто полагается на это в main (), будет делать то же самое в других функциях. Точно нет! Я мог бы поспорить с этим по-другому: тот, кто возвращает 0 без нужды, скорее всего, не понимает, поэтому он, скорее всего, упадет с конца функции. Они, наверное, тоже пишут функции длиной в 500 строк :) - person juanchopanza; 23.08.2013
comment
Это вопрос личного мнения, но я здесь с @ H2CO3. ИМО, это исключение из обычных правил совершенно необоснованно, и, как любое бесполезное правило, я нахожу его болью больше, чем что-либо еще. - person syam; 23.08.2013
comment
@juanchopanza Ну, похоже, вы точно не работали с кодом тех людей, которые у меня есть. О, и я всегда return 0; в конце main(). (Да, теперь ты скажешь мне, что я понятия не имею ...) - person ; 23.08.2013
comment
ИМО, вы действительно не должны полагаться на это; многие компиляторы выдадут предупреждение, если вы ничего не вернете из непустой функции, и мне очень нравится компилировать с флагами -Wall -Werror, поэтому компиляция не удастся из-за этого бесполезного исключения ... - person nijansen; 23.08.2013
comment
Посмотрим правде в глаза. return from main () в основном имеет значение, а затем приложение, предназначенное для запуска из пакетов / сценариев / чего-либо еще, которые полагаются на код возврата. Люди, которые пишут такие приложения / утилиты, знают об этом, и я не думаю, что в этом есть проблема, но кого на Земле волнует, какой код возврата я получаю от Microsoft Word или Visual Studio .. Хорошо, я знаю и согласен что это хорошая практика кода, но я не думаю, что это худшее, что вы можете сделать ... - person evilruff; 23.08.2013
comment
@nijansen, Любой компилятор, который отказывается компилировать, не возвращая что-то из main, не может быть очень хорошим ... - person chris; 23.08.2013
comment
@evilruff То, что вы говорите, имеет смысл, но я бы предпочел разрешить void main() (и заставить среду выполнения преобразовать его в int main(), возвращающий 0), а не иметь это странное исключение из правил возврата. Но может это только я. - person syam; 23.08.2013
comment
Оглядываясь назад, я понимаю, что речь даже не о C / C ++ или каком-либо другом языке. это соглашение ОС, есть возможность получать код возврата для любых целей, которые ему нужны .. кто-нибудь все еще помнит 4Ch функцию прерывания 21h? Я думаю, что функция main (), поскольку любая точка входа сама по себе является довольно «исключительной» (возьмем, например, WinMain () ...), иногда просто забывают, что наши программы существуют в реальном мире, и стандарты по-прежнему должны полагаться на реальные вещи, убежище » t быть «сферическим конем в космосе» ... то есть DLL, которая тоже в каком-то смысле является программным обеспечением, но имеет совершенно другие правила для загрузки / точек входа и т. д. - person evilruff; 23.08.2013
comment
Я говорю о том, что «код возврата» для main () выходит за рамки самого языка ... речь идет о компиляторе для конкретной среды, чтобы решить, что с этим делать ... вот почему main () является исключительным и Я не вижу особых проблем с «особыми случаями». - person evilruff; 23.08.2013
comment
@ H2CO3 main в любом случае не похожа на любую другую функцию (она должна возвращать и int и имеет как минимум две возможные сигнатуры списка параметров, но вы не можете ее перегрузить, вы не можете явно вызвать ее из кода, вы не можете взять ее адрес ...), и каждый достойный программист на C ++ должен знать (или выучить), что это особенный. (В настоящее время реальный код часто возвращает код ошибки (отличный от нуля) из main в случае сбоя, поэтому тогда вполне естественно явно возвращать ноль в случае отсутствия сбоя.) - person gx_; 23.08.2013
comment
У меня нет своего K&R передо мной, но я не думаю, что они возвращали 0 из каждого написанного main (). В худшем случае, это какое-то устаревшее поведение, которое все еще следует поддерживать. - person Jiminion; 23.08.2013
comment
Я согласен, что это ужасно. Компилятор должен иметь особые методы взлома для компиляции внутренней части main только ради неаккуратных программистов. Другие int-возвращающие функции не будут возвращать 0, если управление достигает своего конца и нет оператора возврата. Итак, правило должно применяться ко всем функциям или вообще ни к каким функциям. - person Kaz; 23.08.2013
comment
@Kaz main уже является центром множества хаков, которые делают его официальной точкой входа в программу, добавление правила, согласно которому состояние выхода программы по умолчанию является успешным, вместо того, чтобы требовать ненужной многословности, уже не является ужасным. (main даже не квалифицируется как функция - вы не можете называть его самостоятельно) - person josefx; 01.09.2013
comment
@josefx Вы можете вызывать main в C, но не в C ++. Так что это еще один ужасный прием, хотя и специфичный для C ++. - person Kaz; 01.09.2013

В C ++ и C99 / C11 без оператора return в основной функции по умолчанию возвращается 0;

§ 3.6.1 Основная функция

Оператор return в main имеет эффект выхода из основной функции (уничтожение любых объектов с автоматической продолжительностью хранения) и вызова std :: exit с возвращаемым значением в качестве аргумента. Если элемент управления достигает конца main, не встречая оператора return, результатом будет выполнение return 0;

также прочтите вики-страницу Основная функция C / C ++

Если возвращаемое значение не определено программистом, неявный возврат 0; в конец функции main () вставляется компилятором; такое поведение требуется стандартом C ++.

person billz    schedule 23.08.2013
comment
Небольшая ошибка: для C этого нет в C89, это поддерживают только C99 и C11. - person Yu Hao; 24.08.2013

main должен возвращать int, некоторые компиляторы, включая Turbo C ++, могут допускать другие возвращаемые значения, особенно void main, но это неправильно, никогда не используйте это.

Однако в C ++, если вы явно не возвращаете значение в main, это то же самое, что и return 0;

C ++ 11 §3.6.1 Основная функция раздел 5

Оператор return в main имеет эффект выхода из основной функции (уничтожение любых объектов с автоматической продолжительностью хранения) и вызова std :: exit с возвращаемым значением в качестве аргумента. Если элемент управления достигает конца main, не встречая оператора return, результатом будет выполнение

return 0;

Обратите внимание, что для C это поддерживается только в C99 и более поздних версиях, но не поддерживается в C89.

person Yu Hao    schedule 23.08.2013

В стандарте сказано, что main вернет 0, если нет оператора return. Из раздела черновик стандарта C ++ 3.6.1 абзац 5:

Оператор return в main имеет эффект выхода из основной функции (уничтожение любых объектов с автоматической продолжительностью хранения) и вызов std :: exit с возвращаемым значением в качестве аргумента. Если элемент управления достигает конца основного элемента, не встречая оператора return, результатом будет выполнение

   return 0;

В C99 проекте стандарта в разделе 5.1.2.2.3 говорится:

Если тип возврата основной функции является типом, совместимым с int, возврат от первоначального вызова к основной функции эквивалентен вызову функции выхода со значением, возвращаемым основной функцией в качестве аргумента; 10) достижение }, завершающий основную функцию, возвращает значение 0.

Насколько я могу судить, последняя версия Turbo C ++ довольно старая, и я не могу найти ничего, что определяет, какой стандарт он поддерживает.

person Shafik Yaghmour    schedule 23.08.2013

TC вернет EXIT_SUCCESS независимо от того, явно вы указали или нет

person MG.    schedule 23.08.2013

За исключением соответствия произвольному языковому стандарту, нет никаких веских причин для возврата значения после завершения основной функции.

Это происходит только потому, что процессы в популярных операционных системах имеют представление о коде возврата для завершенного процесса. Нетрудно представить операционную систему, в которой им не нужно возвращать какое-либо значение. Вы также можете представить себе мир, в котором 0 неявно возвращается всеми процессами, если иное не отменено - и в этом случае вы можете делегировать решение о коде возврата системному вызову. (Фактически, такой системный вызов уже существует в виде функции выхода C).

person Tac-Tics    schedule 23.08.2013

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

Хочу отметить, что возвращаемое значение int main очень важно и действительно имеет применение.

Возвращаемое значение из main иногда называют exit status или error code из вашей программы, ноль означает, что она завершилась успешно. Другие программы и сценарии могут получить доступ к этому коду, чтобы определить, успешно ли завершилась ваша программа.

Дополнительная информация здесь: http://en.wikipedia.org/wiki/Exit_status.

person Tyzoid    schedule 23.08.2013