Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Возврат из main

246
13 ноября 2005 года
GIZMO
1.8K / / 30.07.2004
Есть функция
 
Код:
int main(int argc, char* argv[])
{
    printf("Hello!\n\r");
    getch();

    return 0;//2005
}

Так вот вопрос, какое значение должна возвращать функция main? Есть какие-либо требования к значению возвращаемому ей? Или это все на совести программиста. К чему Я спрашиваю, поспорил с одним дятлом, что в принципе возвращать можно какое угодно значение типа int и это важно только для родительского процесса(если ему род. процессу нужно анализировать код возврата). На что он мне говорит:
Цитата:

В один прекрасный момент пользователь программы написанной вами скажет,
прошу прощения, какой идиот писал эту прогу.
Возврат 0-ля это этикет 2005 равносильно пошло все на ....
Возврат 0 это правила любого !!!хорошего!!! программиста.


Может Я "нехороший" программист. Кто из нас не прав, может Я и вправду идиот?

8.5K
13 ноября 2005 года
CaveCanem
13 / / 04.01.2005
Можно и так

 
Код:
void main()
{
 // CODE HERE
}
:)

P.S
Стандарт требует возвращения 0 (нуля) при нормальном завершении и любова интового значения при ошибке.
1
13 ноября 2005 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by CaveCanem

P.S
Стандарт требует возвращения 0 (нуля) при нормальном завершении и любова интового значения при ошибке.


А можно ссылку на статью стандарта?

246
13 ноября 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by kot_
А можно ссылку на статью стандарта?


Да было-бы интересно. Сам ничего найти не могу.

246
13 ноября 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by CaveCanem
Можно и так

 
Код:
void main()
{
 // 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?

3
13 ноября 2005 года
Green
4.8K / / 20.01.2000
Прямого указания, что должна возвращать main в стандарте нет, но косвенное упоминание есть:
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 и т.п.

246
13 ноября 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by Green
Прямого указания, что должна возвращать 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(...) мы узнаем чего же он наработал. Или Я не прав?

3
13 ноября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by GIZMO
Спасибо за ссылки.
А как же тогда общаться с дочерним процессом? Я думал, что то значение которое возвращает main служит для передачи его стартовым кодом в ExitProcess и после завершения дочернего процесса вызовом GetExitCodeProcess(...) мы узнаем чего же он наработал. Или Я не прав?


Никто не запрещает тебе возвращать значения из main руководствуясь другим принципом.
Вот только много ли можно вернуть в DWORD ? :)
К тому же, др. программы (не твои) будут неверно трактовать такие коды возврата.

А для общения процессам лучше использовать pipe и т.п.

246
13 ноября 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by GIZMO
А как же тогда общаться с дочерним процессом? Я думал, что то значение которое возвращает main служит для передачи его стартовым кодом в ExitProcess и после завершения дочернего процесса вызовом GetExitCodeProcess(...) мы узнаем чего же он наработал. Или Я не прав?


Вот попробовал все работает как Я и думал.

246
13 ноября 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by Green
Никто не запрещает тебе возвращать значения из main руководствуясь другим принципом.
Вот только много ли можно вернуть в DWORD ? :)
К тому же, др. программы (не твои) будут неверно трактовать такие коды возврата.

А для общения процессам лучше использовать pipe и т.п.


Так всеже какой вывод: - необходимо возвращать 0 или необязательно? Полагаюсь на твое мнение как на мнение знатока стандартов.
???

2.4K
14 ноября 2005 года
dinasok51
219 / / 12.11.2005
Здесь ссылка на сам стандарт, а не на его интерпретацию

в нем определен лишь код возврата совместимый с int. Все другое не определено.

IMHO необходимость кода вазврата определяет не язык программирования, а среда исполнения - ОС и след. см. док, какова реакция ОС на различные коды завершения твоей прогр.
246
14 ноября 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by dinasok51
Здесь ссылка на сам стандарт, а не на его интерпретацию

в нем определен лишь код возврата совместимый с int. Все другое не определено.

IMHO необходимость кода вазврата определяет не язык программирования, а среда исполнения - ОС и след. см. док, какова реакция ОС на различные коды завершения твоей прогр.


А, что там по немецки? Я и по английски-то с трудом понимаю. Все равно спасибо.

3
14 ноября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by dinasok51
Здесь ссылка на сам стандарт, а не на его интерпретацию


Интерпритацию? Что бы это значило?

2.4K
14 ноября 2005 года
dinasok51
219 / / 12.11.2005
Цитата:
Originally posted by GIZMO
А, что там по немецки? Я и по английски-то с трудом понимаю. Все равно спасибо.



GIZMO

Извини, не то скопировал вот ссылка на стандарт
см 5.1.2.2.3

а здесь ссылка на все


Green

Под интерпретацией я понимаю изложение официальных документов, часто очень близко к тексту, но это не сам документ

585
14 ноября 2005 года
honeybeer
297 / / 06.09.2004
Цитата:
Originally posted by Green
Интерпритацию? Что бы это значило?


Вот енто черновики стандарта, наиболее близкие к оному: STD

3
14 ноября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by dinasok51
Под интерпретацией я понимаю изложение официальных документов, часто очень близко к тексту, но это не сам документ


Хм... не знал, что рабочая версия стандарта С++ является интерпретацией стандарта ANSI-C.

Само описание стандарта стоит денег и я не думаю, что кто-то выложит его последнюю версию (тем более в HTML) на всеобщее обозрение (если я ошибаюсь, то поделись ссылкой, плз).
Поэтому я привожу ссылки на РАБОЧИЙ ДОКУМЕНТ, а не на "интерпретацию". Могу заверить, что сам стандарт мало отличается рабочего документа.

Цитата:
Originally posted by GIZMO

Так всеже какой вывод: - необходимо возвращать 0 или необязательно? Полагаюсь на твое мнение как на мнение знатока стандартов.


Как я уже говорил в стандарте прямого упоминания нет, поэтому возвращаемые значения регламентируются скорее не стандартом, а средой выполнения, и скорее даже не ОС, а shell-ом. Известные мне оболочки (DOS-shell, bash, и т.п.) интерпретируют ноль, как удачное завершение, а отличное от нуля, как код ошибки.

2.4K
14 ноября 2005 года
dinasok51
219 / / 12.11.2005
Cмотри и наслаждайся
3
14 ноября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by dinasok51
Cмотри и наслаждайся


Да спасибо, этот документ у меня есть. Но это версия от 1998 года без корректировки 2003 года.
Кроме того, это не HTML версия, и ссылки на неё, согласись, довольно трудно давать.

Суть топика была иная, так что если хочешь поспорить про различия между стандартом 1998 года и Working Paper 1996 года, то предлагаю сделать это в отдельной ветке.

3
16 ноября 2005 года
Green
4.8K / / 20.01.2000
Кстати, стандарт от 2003:
http://anatolix.naumen.ru/files/books/CPPStandard2003.zip
2.4K
16 ноября 2005 года
dinasok51
219 / / 12.11.2005
Спасибо.
4.8K
16 ноября 2005 года
Jump
128 / / 09.11.2005
ИМХО
1.Запуск приложения - есть вызов его функции int main(...);
2.Кто функцию вызывает - тот ее результат и обрабатывает;
3.ОС не обрабатывает этот результат - если она запускает процесс, скажем так, "не для своих нужд".
3
16 ноября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Jump
ИМХО
1.Запуск приложения - есть вызов его функции int main(...);
2.Кто функцию вызывает - тот ее результат и обрабатывает;


Ага... startup код, никто другой не имеет права вызывать main. Но обработка результата startup-кодом - это передача его (результата) родительскому процессу.

Цитата:
Originally posted by Jump

3.ОС не обрабатывает этот результат - если она запускает процесс, скажем так, "не для своих нужд".


ОС - это не субъект и не единое целое, у неё нет "своих нужд".

P.S. А к чему твой пост то был?

585
17 ноября 2005 года
honeybeer
297 / / 06.09.2004
Цитата:
Originally posted by Green
Ага... startup код, никто другой не имеет права вызывать main...


Неправда, если выкинуть из проекта поддержку CRT, и назначить точку входа на main, то вызываться будет именно она.

3
17 ноября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by honeybeer
Неправда, если выкинуть из проекта поддержку CRT, и назначить точку входа на main, то вызываться будет именно она.


Это из другой оперы.

246
17 ноября 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by GIZMO

...
Так вот вопрос, какое значение должна возвращать функция main?
...


И еще в подветждение того, что ОБЯЗАТЕЛЬНО оппонент приводит цитату из книги "... за 21 день". Мне смеяться или плакать? :(

3
17 ноября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by GIZMO
И еще в подветждение того, что ОБЯЗАТЕЛЬНО оппонент приводит цитату из книги "... за 21 день". Мне смеяться или плакать? :(


Я тоже считаю возвращение 0 в случае удачного завершения ОБЯЗАТЕЛЬНЫМ (но не необходимым), но аргументировать это "научно-популяроной" литературой не стал бы... :)

4.8K
17 ноября 2005 года
Jump
128 / / 09.11.2005
Цитата:
Originally posted by Green
ОС - это не субъект и не единое целое, у неё нет "своих нужд".

P.S. А к чему твой пост то был?


Не субьект, но объект - уж точно... Значит "свои нужды" (иненнов в кавычках) у нее вполне есть. В общем все это не суть.
Постом я хотел выразить свое понимание данного вопроса, сформированного на опыте (поэтому и написал ИМХО в самом начале), т.к. я в этом main че только не возвращал - и ничего, ОСь не разу не подавилась :)

14K
19 ноября 2005 года
Муравъед
3 / / 19.11.2005
господи делов то на копейку приведи своему корешку такой прим void main(void)
{
return;
}
и будете догадываться что вернёт return? :D
3
19 ноября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Муравъед
господи делов то на копейку приведи своему корешку такой прим void main(void)
{
return;
}
и будете догадываться что вернёт return? :D


Вопрос не в том, что вернет return, а что вернет процесс и как это будет интерпретировано окружением. В данном случае он вернет ноль, что во всех известных мне оболочках значит "удачное завершение".

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог