Возврат из main
{
printf("Hello!\n\r");
getch();
return 0;//2005
}
Так вот вопрос, какое значение должна возвращать функция main? Есть какие-либо требования к значению возвращаемому ей? Или это все на совести программиста. К чему Я спрашиваю, поспорил с одним дятлом, что в принципе возвращать можно какое угодно значение типа int и это важно только для родительского процесса(если ему род. процессу нужно анализировать код возврата). На что он мне говорит:
В один прекрасный момент пользователь программы написанной вами скажет,
прошу прощения, какой идиот писал эту прогу.
Возврат 0-ля это этикет 2005 равносильно пошло все на ....
Возврат 0 это правила любого !!!хорошего!!! программиста.
Может Я "нехороший" программист. Кто из нас не прав, может Я и вправду идиот?
{
// CODE HERE
}
P.S
Стандарт требует возвращения 0 (нуля) при нормальном завершении и любова интового значения при ошибке.
P.S
Стандарт требует возвращения 0 (нуля) при нормальном завершении и любова интового значения при ошибке.
А можно ссылку на статью стандарта?
А можно ссылку на статью стандарта?
Да было-бы интересно. Сам ничего найти не могу.
Можно и так
{
// CODE HERE
}
P.S
Стандарт требует возвращения 0 (нуля) при нормальном завершении и любова интового значения при ошибке.
Из хелпа про: The Value main() Returns
The value returned by main is the status code of the program: an int. If, however, your program uses the routine exit (or _exit) to terminate, the value returned by main is the argument passed to the call to exit (or to _exit).
For example, if your program contains the call
exit(1)
the status is 1.
Хоть Я и английского не знаю толком, но что-то про return 0 ничего не слышу, а?
Ну Я допускаю, что Билдер != стандарт, но всеже где это сказано ОБЯЗЯТЕЛЬНО возвразщение 0?
http://www.csci.csusb.edu/dick/c++std/cd2/basic.html#basic.start.main
3.6.1.5
.....
If control reaches the end of main without encountering a return statement, the effect is that of executing
return 0;
Так же о коде возврата говорится в описании exit()
http://www.csci.csusb.edu/dick/c++std/cd2/lib-support.html#lib.support.start.term
18.3.4
.....
-- Finally, control is returned to the host environment. If status is zero or EXIT_SUCCESS, an implementation-defined form of the status successful termination is returned. If status is EXIT_FAILURE, an implementation-defined form of the status unsuccessful termination is returned.
Кроме того надо заметить, что возвращаемое значение ноль воспринимается всеми оболочками, как нормальное завершение, а отличное от нуля, как завершение с ошибкой. Например, в DOS отличное от нуля значение воспринимается, как код ошибки, и используется в конструкциях IF ERRORLEVEL и т.п.
Прямого указания, что должна возвращать main в стандарте нет, но косвенное упоминание есть:
http://www.csci.csusb.edu/dick/c++std/cd2/basic.html#basic.start.main
Так же о коде возврата говорится в описании exit()
http://www.csci.csusb.edu/dick/c++std/cd2/lib-support.html#lib.support.start.term
Кроме того надо заметить, что возвращаемое значение ноль воспринимается всеми оболочками, как нормальное завершение, а отличное от нуля, как завершение с ошибкой. Например, в DOS отличное от нуля значение воспринимается, как код ошибки, и используется в конструкциях IF ERRORLEVEL и т.п.
Спасибо за ссылки.
А как же тогда общаться с дочерним процессом? Я думал, что то значение которое возвращает main служит для передачи его стартовым кодом в ExitProcess и после завершения дочернего процесса вызовом GetExitCodeProcess(...) мы узнаем чего же он наработал. Или Я не прав?
Спасибо за ссылки.
А как же тогда общаться с дочерним процессом? Я думал, что то значение которое возвращает main служит для передачи его стартовым кодом в ExitProcess и после завершения дочернего процесса вызовом GetExitCodeProcess(...) мы узнаем чего же он наработал. Или Я не прав?
Никто не запрещает тебе возвращать значения из main руководствуясь другим принципом.
Вот только много ли можно вернуть в DWORD ? :)
К тому же, др. программы (не твои) будут неверно трактовать такие коды возврата.
А для общения процессам лучше использовать pipe и т.п.
А как же тогда общаться с дочерним процессом? Я думал, что то значение которое возвращает main служит для передачи его стартовым кодом в ExitProcess и после завершения дочернего процесса вызовом GetExitCodeProcess(...) мы узнаем чего же он наработал. Или Я не прав?
Вот попробовал все работает как Я и думал.
Никто не запрещает тебе возвращать значения из main руководствуясь другим принципом.
Вот только много ли можно вернуть в DWORD ? :)
К тому же, др. программы (не твои) будут неверно трактовать такие коды возврата.
А для общения процессам лучше использовать pipe и т.п.
Так всеже какой вывод: - необходимо возвращать 0 или необязательно? Полагаюсь на твое мнение как на мнение знатока стандартов.
???
в нем определен лишь код возврата совместимый с int. Все другое не определено.
IMHO необходимость кода вазврата определяет не язык программирования, а среда исполнения - ОС и след. см. док, какова реакция ОС на различные коды завершения твоей прогр.
Здесь ссылка на сам стандарт, а не на его интерпретацию
в нем определен лишь код возврата совместимый с int. Все другое не определено.
IMHO необходимость кода вазврата определяет не язык программирования, а среда исполнения - ОС и след. см. док, какова реакция ОС на различные коды завершения твоей прогр.
А, что там по немецки? Я и по английски-то с трудом понимаю. Все равно спасибо.
Интерпритацию? Что бы это значило?
А, что там по немецки? Я и по английски-то с трудом понимаю. Все равно спасибо.
GIZMO
Извини, не то скопировал вот ссылка на стандарт
см 5.1.2.2.3
а здесь ссылка на все
Green
Под интерпретацией я понимаю изложение официальных документов, часто очень близко к тексту, но это не сам документ
Интерпритацию? Что бы это значило?
Вот енто черновики стандарта, наиболее близкие к оному: STD
Под интерпретацией я понимаю изложение официальных документов, часто очень близко к тексту, но это не сам документ
Хм... не знал, что рабочая версия стандарта С++ является интерпретацией стандарта ANSI-C.
Само описание стандарта стоит денег и я не думаю, что кто-то выложит его последнюю версию (тем более в HTML) на всеобщее обозрение (если я ошибаюсь, то поделись ссылкой, плз).
Поэтому я привожу ссылки на РАБОЧИЙ ДОКУМЕНТ, а не на "интерпретацию". Могу заверить, что сам стандарт мало отличается рабочего документа.
Так всеже какой вывод: - необходимо возвращать 0 или необязательно? Полагаюсь на твое мнение как на мнение знатока стандартов.
Как я уже говорил в стандарте прямого упоминания нет, поэтому возвращаемые значения регламентируются скорее не стандартом, а средой выполнения, и скорее даже не ОС, а shell-ом. Известные мне оболочки (DOS-shell, bash, и т.п.) интерпретируют ноль, как удачное завершение, а отличное от нуля, как код ошибки.
Cмотри и наслаждайся
Да спасибо, этот документ у меня есть. Но это версия от 1998 года без корректировки 2003 года.
Кроме того, это не HTML версия, и ссылки на неё, согласись, довольно трудно давать.
Суть топика была иная, так что если хочешь поспорить про различия между стандартом 1998 года и Working Paper 1996 года, то предлагаю сделать это в отдельной ветке.
1.Запуск приложения - есть вызов его функции int main(...);
2.Кто функцию вызывает - тот ее результат и обрабатывает;
3.ОС не обрабатывает этот результат - если она запускает процесс, скажем так, "не для своих нужд".
ИМХО
1.Запуск приложения - есть вызов его функции int main(...);
2.Кто функцию вызывает - тот ее результат и обрабатывает;
Ага... startup код, никто другой не имеет права вызывать main. Но обработка результата startup-кодом - это передача его (результата) родительскому процессу.
3.ОС не обрабатывает этот результат - если она запускает процесс, скажем так, "не для своих нужд".
ОС - это не субъект и не единое целое, у неё нет "своих нужд".
P.S. А к чему твой пост то был?
Ага... startup код, никто другой не имеет права вызывать main...
Неправда, если выкинуть из проекта поддержку CRT, и назначить точку входа на main, то вызываться будет именно она.
Неправда, если выкинуть из проекта поддержку CRT, и назначить точку входа на main, то вызываться будет именно она.
Это из другой оперы.
...
Так вот вопрос, какое значение должна возвращать функция main?
...
И еще в подветждение того, что ОБЯЗАТЕЛЬНО оппонент приводит цитату из книги "... за 21 день". Мне смеяться или плакать? :(
И еще в подветждение того, что ОБЯЗАТЕЛЬНО оппонент приводит цитату из книги "... за 21 день". Мне смеяться или плакать? :(
Я тоже считаю возвращение 0 в случае удачного завершения ОБЯЗАТЕЛЬНЫМ (но не необходимым), но аргументировать это "научно-популяроной" литературой не стал бы... :)
ОС - это не субъект и не единое целое, у неё нет "своих нужд".
P.S. А к чему твой пост то был?
Не субьект, но объект - уж точно... Значит "свои нужды" (иненнов в кавычках) у нее вполне есть. В общем все это не суть.
Постом я хотел выразить свое понимание данного вопроса, сформированного на опыте (поэтому и написал ИМХО в самом начале), т.к. я в этом main че только не возвращал - и ничего, ОСь не разу не подавилась :)
{
return;
}
и будете догадываться что вернёт return? :D
господи делов то на копейку приведи своему корешку такой прим void main(void)
{
return;
}
и будете догадываться что вернёт return? :D
Вопрос не в том, что вернет return, а что вернет процесс и как это будет интерпретировано окружением. В данном случае он вернет ноль, что во всех известных мне оболочках значит "удачное завершение".