Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700

Использование return в main

11.08.2017, 12:33. Показов 3226. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Если возвращаем 0 то это означает что прога норм завершилась, иначе значит были какие то ошибки, это понятно.

Но зачем ОС нужны эти коды?
Чего она с ними делает?
Можно ли к этим кодам получить доступ из третьей программы?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.08.2017, 12:33
Ответы с готовыми решениями:

Почему в одних случаях пишут void main(), а в других случаях int main() {return 1;}
Препод мне доказывает, что void в main`е писать неправильно, а объяснить не может почему. Кто расскажет?)

`main' must return `int'
Почему возникает такая ошибка? И я правильно программу написал? Она должна считать сумму двух чисел! #include <iostream> ...

[Error] '::main' must return 'int'
Можете подсказать как испавить. При компиляции выдает '::main' must return 'int' Вот прога double mid(double x, double y); void...

32
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
12.08.2017, 18:04
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Undisputed Посмотреть сообщение
А если возвращаемый тип main указан как void, то какой код получит вызывающая программа?
В реальности main вызывается не из космоса, а из другой функции, спрятанной в системной библиотеке. Эта функция вызывает main с прототипом, ожидающим возврата int. Поэтому после возврата из main эта функция будет искать возвращаемое значение в регистре или в стеке, в котором по программным соглашениям должно быть передано значение. Т.е. прочитает какой-то мусор, а потому программа в окружающий в любом случае что-то вернёт, но не известно что. Т.е. это эквивалентно использованию неинициализированного значения
4
Заблокирован
12.08.2017, 21:39
Цитата Сообщение от Undisputed Посмотреть сообщение
А... Я вроде путаю shall и should
should это не "должен, но не обязательно", а "рекомендовано".

Цитата Сообщение от MrGluck Посмотреть сообщение
И желательно (shall)...
Найми репетитора по английскому.

Цитата Сообщение от MrGluck Посмотреть сообщение
Есть разница между must и shall.
В общем случае — только стилистическая. В обычной речи shall в смысле "обязан" не употребляют.
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
12.08.2017, 22:39
Цитата Сообщение от Evg Посмотреть сообщение
прочитает какой-то мусор, а потому программа в окружающий в любом случае что-то вернёт, но не известно что.
У компилятора от MS void main() - вещь вполне законная - поэтому функция, о которой вы говорите, скорее всего, вернет среде (Венде) 0.
Здесь в теме немного другая интрига. Адепты MS занялись творческим переводом с английского, чтобы доказать, что эта самая void main() не нарушает стандарт, а только является особенностью реализации.
С другой стороны, это дополнение есть не просит и никому сильно не мешает.
Кто-то здесь на форуму доказывал, что ругань Мелкосовтвского компилятора на strcpy() с требованием заметить ее на strcpy_s() тоже соответствует стандарту. Только они обосновывали это соображениями безопасности, а не тонкостями лингвистики.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
12.08.2017, 23:41
Цитата Сообщение от gng Посмотреть сообщение
У компилятора от MS void main() - вещь вполне законная - поэтому функция, о которой вы говорите, скорее всего, вернет среде (Венде) 0.
Вполне возможно. Просто я описал самый общий случай. Просто в учебниках обычно пишут, что main - это точка начала работы программы, хотя почти везде (а может даже и везде) это не так. Реальная точка входа в программу находится в другом месте, а main - это лишь точка входа в пользовательскую часть программы. Это далеко не всем очевидно, а потому моё объяснение будет явно не лишним
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
13.08.2017, 07:16
Кто-то здесь на форуму доказывал, что ругань Мелкосовтвского компилятора на strcpy() с требованием заметить ее на strcpy_s() тоже соответствует стандарту. Только они обосновывали это соображениями безопасности, а не тонкостями лингвистики.
функции с суффиксом _s теперь входят в стандарт C11,
хотя их поддержка является опциональной для компилятора.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
13.08.2017, 10:41  [ТС]
Evg,
А каким образом происходит поиск этого значения?

Насколько я понимаю т.к функция мейн может быть войд делать вызов под капотом code = main() было бы не корректным.
Второй вариант(более менее похожий на правду) это создание указателя в той самой функции на конкретный адрес возврата, и чтение данных путём разыменования. Но адреса при каждом перезапуске меняются. Как вызывающая сторона знает где именно лежит нужное значение?

Пока первое что пришло в голову это то что т.к программы используют виртуальные адреса а не физические, ОС при выделении виртуальных адресов для программы сама выделяет адрес возврата этого кода, который можно получить с помощью какого нибудь системного вызова... Кстати не подскажешь где сорцы этой штуки можно глянуть?
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
13.08.2017, 12:45
Цитата Сообщение от Undisputed Посмотреть сообщение
Насколько я понимаю т.к функция мейн может быть войд делать вызов под капотом code = main() было бы не корректным.
Второй вариант(более менее похожий на правду) это создание указателя в той самой функции на конкретный адрес возврата, и чтение данных путём разыменования. Но адреса при каждом перезапуске меняются. Как вызывающая сторона знает где именно лежит нужное значение?
Вы углубляетесь в детали реализации. Что конкретно делает компилятор MS - его проблемы. Самое простое решение - поменять при компилировании void маin() на int main() ... returm 0l; и дальше передавать модуль линкеру.
"Съевший собаку" на дизассемблированиии Evg может найдет время описать вам действия Мксофт-компилятора детальнее.
1
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
13.08.2017, 13:55
написал две проги (VS2008)
C++
1
2
3
void main()
{
}
C++
1
2
3
4
int main()
{
return 0;
}
и дизасемблировал их
для первой
точка входа в программу

Assembler
1
2
3
4
public start
start proc near
jmp     _mainCRTStartup
start endp
Assembler
1
2
3
4
5
6
7
8
9
_mainCRTStartup proc near
mov     edi, edi
push    ebp
mov     ebp, esp
call    j____security_init_cookie
call    __tmainCRTStartup
pop     ebp
retn
_mainCRTStartup endp
Assembler
1
2
3
4
5
6
7
8
9
10
11
__tmainCRTStartup proc near
........
;здесь интересуют вот эти строки
 call    j__main
   add     esp, 0Ch
   mov     mainret, eax
   cmp     managedapp, 0
   jnz     short loc_411725
   mov     eax, mainret
   push    eax             ; Code
   call    ds:__imp__exit
ну и сама функция Main
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
; Attributes: bp-based frame
 
; int __cdecl main()
_main proc near
 
var_C0= byte ptr -0C0h
 
push    ebp
mov     ebp, esp
sub     esp, 0C0h
push    ebx
push    esi
push    edi
lea     edi, [ebp+var_C0]
mov     ecx, 30h
mov     eax, 0CCCCCCCCh
rep stosd
xor     eax, eax
pop     edi
pop     esi
pop     ebx
mov     esp, ebp
pop     ebp
retn
_main endp
для второго все тоже самое (стратап)
функция main
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
; Attributes: bp-based frame
 
; int __cdecl main()
_main proc near
 
var_C0= byte ptr -0C0h
 
push    ebp
mov     ebp, esp
sub     esp, 0C0h
push    ebx
push    esi
push    edi
lea     edi, [ebp+var_C0]
mov     ecx, 30h
mov     eax, 0CCCCCCCCh
rep stosd
xor     eax, eax
pop     edi
pop     esi
pop     ebx
mov     esp, ebp
pop     ebp
retn
_main endp
как видно никакой разницы
void main компилятор заменил на int main
добавив
C++
1
return 0;
Assembler
1
2
xor eax,eax;
retn
по моему мнению это сделали для того, чтобы компилировать старые сишные программы с void main без лишней ругани
4
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
13.08.2017, 14:05
ValeryS, из ответов на msdn:
In general, a void function returns nothing, while an int function returns an int. In the context of 'main' specifically, having a void return type is illegal, and is only accepted for backwards compatibility purposes -- always use 'int main'.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
13.08.2017, 14:13
Цитата Сообщение от Croessmah Посмотреть сообщение
and is only accepted for backwards compatibility purposes
ну так я так и говорю
Цитата Сообщение от ValeryS Посмотреть сообщение
компилировать старые сишные программы с void main без лишней ругани
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
13.08.2017, 23:07
Цитата Сообщение от Undisputed Посмотреть сообщение
А каким образом происходит поиск этого значения?
По программным соглашениям. Конкретно для intel/amd функция main пишет в регистр %eax возвращаемое значение. А там, где функцию main вызывали, читают регистр %eax. Если функция main в регистр %eax ничего не запишет, то в точке вызова main просто прочитается какое-нибудь мусорное значение

Добавлено через 33 минуты
Ну и чтобы пощупать вживую, можно это проверить на модели этого самого:

C
/* Файл t1.c */
#include <stdio.h>
 
extern int my_main (void);
 
int main (void)
{
  int r;
  r = my_main ();
  printf ("%d\n", r);
  return 0;
}
C
/* Файл t2.c */
int A = 5, B = 6;
 
void my_main (void)
{
  /* Сюда добавим пофиг какой код, лишь бы оптимизатор его не вытравил */
  int i;
  for (i = 0; i < A; i++)
    B += A;
}
Code
$ gcc t1.c t2.c
$ ./a.exe
5
Примерно так будет выглядеть функция main, которая в точке вызова описана с результатом типа int, а в реальности имеет результат типа void
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
14.08.2017, 00:04  [ТС]
Evg,
Спасибо! А что за регистр %eax? Я встречал просто eax, без процента
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
14.08.2017, 00:38
Цитата Сообщение от Undisputed Посмотреть сообщение
А что за регистр %eax?
AT&T-синтаксис
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.08.2017, 00:38

Ошибка main' must return 'int'
Line 6: error: '::main' must return 'int' compilation terminated due to -Wfatal-errors!!! Вот задаие::Данная матрица А (4,5), элементы...

В чём смысл return в main()?
Есть ли смысл возвращать значение переменной в main()? Если да - зачем? #include&lt;iostream&gt; using namespace std; int...

Ошыбка File1.cpp(29): E2467 'main()' cannot return a value
#include&lt;stdio.h&gt; #include&lt;conio.h&gt; #include&lt;math.h&gt; #define pi 3.14159 //Прототип функцій: float BitshPoverhnja (float rc,...

int main() и его return(узнать код завершения программы в cmd)
Доброе утро всем. Вопрос таков. Если в конце программы мы поставим ретерн 15(а не 0), то как узнать чему равен мэйн, если не видеть этот...

Использование инструкции return
Помогите разобраться в коде: #include &lt;iostream&gt; using namespace std; void power(int base, int exp); int main() { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru