Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/25: Рейтинг темы: голосов - 25, средняя оценка - 4.56
0 / 0 / 3
Регистрация: 04.11.2016
Сообщений: 107

Зачем в C++ функция main()?

31.08.2021, 09:15. Показов 5337. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть такой вопрос, для чего нужен main() если функции в конструкторе класса выполняются раньше, чем код main?
C++
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
#include <iostream> 
 
using namespace std;
 
class Main
{
    public:
        Main()
        {
            cout << "Main called" << endl;
        }
};
 
Main *m = new Main();
 
int main()
{
    cout << "main called" << endl;
    return 0;
}
/*
Выход:
Main called
main called
*/
Но при этом, если попытаться скомпилировать программу без main, то будет вызвана ошибка компиляции.
В смысле, обязательный код выполняется в последнюю очередь?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.08.2021, 09:15
Ответы с готовыми решениями:

Зачем в функцию main передается void?
Учительница рассказывала как сделать ​​программу калькулятор на сложение #include&lt;iostream.h&gt; int main(void) { int x, y; ...

Функция main
Ребят задание скомпилировать код в командной строке vc++ и запустить программу.Делаю так: c:\...\lab10 cl -GX user.cpp Вот...

функция main()
может ли функция возвращать функцию int z() { ....... //надо типо того сделать return int main(); } void x() {

28
 Аватар для COKPOWEHEU
4138 / 2716 / 433
Регистрация: 09.09.2017
Сообщений: 12,050
31.08.2021, 15:47
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от _lunar_ Посмотреть сообщение
А так программа начинается с инициализации в ntdll
Первый раз слышу про ntdll. Что это такое и как его увидеть? Ассемблерный стартап файл видел, а эту вашу ntdll - нет.
Цитата Сообщение от blogerjackpraid Посмотреть сообщение
Вы про асинхронную инициализацию переменных?
Не асинхронную. Инициализация всегда идет по очереди, просто мы эту очередность обычно не знаем.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
 
__attribute__((constructor)) void init1(){
  printf("Init1\n");
}
 
__attribute__((constructor)) void init2(){
  printf("Init2\n");
}
 
int main(){
  printf("main\n");
}
 
__attribute__((constructor)) void init3(){
  printf("Init3\n");
}
В данном случае сначлаа будут вызваны ВСЕ конструкторы, и только потом main(). Если вы основной код засунете в init2, то сначала вызовется init1, потом ваш init2 с полезным кодом, а инициализация init3 не вызовется вообще (ну точнее вызовется, но уже после завершения программы, когда она никому не нужна).
А теперь представьте, что ваш проект состоит не из одного main.c, а из кучи файлов и библиотек.
Цитата Сообщение от Croessmah Посмотреть сообщение
Потому что выполнение начинается задолго до вызова main. Что не так?
Выполнение или инициализация?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
31.08.2021, 15:49
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Выполнение или инициализация?
Выполнение программы. Да и динамическая инициализация выполняется уже в процессе выполнения так-то.

Внутри рантайма это выглядит как-то так:

Code
1
2
3
4
5
6
7
8
9
10
function entry() {
    //Программа уже запущена и работает!
    //Выполняем всякое разное перед запуском main, 
    //например, создаем и инициализируем cin, cout, пользовательские объекты
    int retCode = main();
    //Программа всё еще работает
    //Выполняем всякое разное после завершения main,
    //например, вызываем нужные деструкторы
    //завершаем приложение с retCode
}
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
31.08.2021, 18:24
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Что это такое и как его увидеть?
системная библиотека винды - ntdll.dll (Windows\System32)

собственно трасса до системного брейкпоинта
ntdll.RtlUserThreadStart -> ntdll.LdrpInitialize -> ntdll._LdrpInitialize -> ntdll.LdrInitSecurityCookie -> ntdll.LdrpInitializeProcess
отсюда и начинается исполнение программы - с получения объекта ядра.

затем управление возвращается главному модулю в OEP (в mainCRTStartup).
0
 Аватар для COKPOWEHEU
4138 / 2716 / 433
Регистрация: 09.09.2017
Сообщений: 12,050
31.08.2021, 18:36
Цитата Сообщение от Croessmah Посмотреть сообщение
Выполнение программы.
А выполнение начинается даже позже main. Сначала идет "пассивная" инициализация (стек, константы, железо), потом "активная" инициализация (юзерские конструкторы и прямые вызовы функций иницивлизации из main) и только потом выполнение.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int x = 1; //"пассивная" инициализация
 
__attribute__((constructor)) void init1(){ //"активная" инициализация
  printf("Init1\n");
}
 
void init_smth(){
  //
}
 
int main(){
  init_smth(); //"активная" инициализация
  code(); //выполнение
  code();
}
Как-то так. Иногда инициализация не заканчивается и во время выполнения.
Это если говорить про логическое разделение.
Если про разделение на уровне языка Си, то инициализация - все, что до main. Если на уровне языка Ассемблер, то инициализации может не быть вообще. Хотя startup все равно пишут, можно инициализацией его назвать.

Добавлено через 8 минут
Цитата Сообщение от _lunar_ Посмотреть сообщение
системная библиотека винды - ntdll.dll (Windows\System32)
А какое нам дело до винды? Мы же обсуждаем Си.
Вот здесь я кое-как описывал как появляется startup файл (уж прошу прощения, что сам на себя ссылаюсь, но быстро не нашел). В приложении микроконтроллера gd32vf103. Если говорить коротко, то стартап настраивает стек, копирует данные инициализации из ПЗУ в ОЗУ, настраивает некоторые регистры, настраивает прерывания и еще кое-что по мелочи. А потом вызывает main как обычную функцию (ну почти обычную, поскольку не ожидает возврата оттуда - контроллер же).
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
31.08.2021, 18:57
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А какое нам дело до винды?
точно так же могу спросить - какое нам дело до линя и вообще других ос?

я не знаю чего вы там обсуждаете, я отвечал ТСу на его вопрос.
а т.к. 99% юзеров это винда, то и ответ был по винде.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
я кое-как описывал как появляется startup файл
мы сейчас речь ведём о работе файлов в оси, а не старта с биоса/уефи..

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Если говорить коротко, то стартап настраивает стек, копирует данные инициализации из ПЗУ в ОЗУ, настраивает некоторые регистры, настраивает прерывания и еще кое-что по мелочи. А потом вызывает main как обычную функцию (ну почти обычную, поскольку не ожидает возврата оттуда - контроллер же).
у вас очень узкие представления того, что происходит до main.
поотлаживайте в ядерном отладчике любой старт РЕ файла как-нить на досуге
0
0 / 0 / 3
Регистрация: 04.11.2016
Сообщений: 107
31.08.2021, 19:08  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Мы же обсуждаем Си.
Я обсуждаю сперва особенности ООП на C++, а во вторую же очередь процедурщину на Си.
Цитата Сообщение от _lunar_ Посмотреть сообщение
мы сейчас речь ведём о работе файлов в оси, а не старта с биоса/уефи
Си и C++ - они и в африке Си и C++, и даже не думайте сюда втыкать заголовочные файлы от Windows, так как эти ЯП изначально были задуманы для переноса проектов из одной платформы на другую с минимальной болью.
И да, BIOS/UEFI просто не содержит стандартных заголовков, так что программирование на нём приближено к программированию не то древних ПК, не то ардуино.
0
 Аватар для COKPOWEHEU
4138 / 2716 / 433
Регистрация: 09.09.2017
Сообщений: 12,050
31.08.2021, 20:04
Цитата Сообщение от _lunar_ Посмотреть сообщение
точно так же могу спросить - какое нам дело до линя и вообще других ос?
То есть вы подразумеваете, что винда - единственная ОС, но спрашиваете меня почему я так считаю? Но это ваше мнение, не мое.
В отличие от вас, я писал про общее устройство программы на Си, без привязки к какой-то конкретной ОС. Собственно, по ссылке пример вообще без ОС.
Цитата Сообщение от _lunar_ Посмотреть сообщение
мы сейчас речь ведём о работе файлов в оси
Ну что вы! Разумеется, нет.
Цитата Сообщение от _lunar_ Посмотреть сообщение
у вас очень узкие представления того, что происходит до main.
поотлаживайте в ядерном отладчике любой старт РЕ файла как-нить на досуге
Сдается мне, вы переоцениваете свои знания. Лучше сразу скажите что я по-вашему должен там увидеть.
Цитата Сообщение от blogerjackpraid Посмотреть сообщение
Я обсуждаю сперва особенности ООП на C++, а во вторую же очередь процедурщину на Си.
атрибут "конструктор" я использовал только потому что он проще и компактнее. А суть ровно та же.
Цитата Сообщение от blogerjackpraid Посмотреть сообщение
И да, BIOS/UEFI просто не содержит стандартных заголовков, так что программирование на нём приближено к программированию не то древних ПК, не то ардуино.
Насколько я видел программирование efi, там свои заголовочные файлы и свое API. Прямой работы с железом там практически нет.
0
0 / 0 / 3
Регистрация: 04.11.2016
Сообщений: 107
31.08.2021, 20:15  [ТС]
Цитата Сообщение от _lunar_ Посмотреть сообщение
поотлаживайте в ядерном отладчике любой старт РЕ файла как-нить на досуге

Не по теме:

Я компилирую мой код в ELF. Уже не припомню, когда Linux поддерживал PE файлы.
Может виндовсом пользуется большинство пользователей ПК в общем, среди программистов Windows не шибко популярен, в отличии от Linux.
Windows он крайне неудобен для разработки, я пытался что-то написать, это просто ад.
Linux же создан программистами для программистов. Да и код, запускаемый на Linux работает быстрее, чем на Windows.

0
249 / 79 / 31
Регистрация: 29.03.2020
Сообщений: 497
31.08.2021, 22:28
Цитата Сообщение от blogerjackpraid Посмотреть сообщение
Я компилирую мой код в ELF.
тогда так
поотлаживайте в ядерном отладчике любой старт ELF файла как-нить на досуге
раз уж вы такой впечатлительный
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.08.2021, 22:28

Функция main () {}
Есть разные варианты синтаксиса функции мэйн 1.void main () {} 2. int main () {return 0;} 3. int main() {} 4. main (void) {} ...

Функция main
В одномерном массиве, вводимом с клавиатуры и состоящем из 10 вещественных элементов, вычислить: 1) если задана опция -ko - ...

Функция main с аргументами
Приветствую, подскажите где именно указывать параметры аргументов(int argc, char **argv), если использовать следующий тип записи int...

Функция не видит переменных из main
Составьте программу, которая будет выводить на экран два разных сообщения (например, “Hello, World !” и “Hello, my darling !”),...

Функция main() и ситаксические ошибки
Доброго времени суток. Написал вот такую бредятину штуку: #include &lt;windows.h&gt; #include &lt;cstring&gt; int main(); int a =...


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

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Новые блоги и статьи
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru