![]() |
|
Модераторы: bsa |
![]()
|
|
| Hagrael |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 26.6.2011 Репутация: нет Всего: нет |
Здравствуйте, форумчане.
Я заметил, что когда создаешь Console Application, то программа начинается с функции main, а когда Win32 GUI Application, то главная функция программы - функция WinMain. Значит ли это, что проект компилируется по-разному в зависимости от его типа? Заранее благодарен. Это сообщение отредактировал(а) Hagrael - 22.7.2011, 16:16 |
|||
|
||||
| triclosan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 515 Регистрация: 18.8.2006 Репутация: 2 Всего: 12 |
WinMain ?
|
|||
|
||||
| Hagrael |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 26.6.2011 Репутация: нет Всего: нет |
triclosan, да, опечатка
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Компилируется он так же, он линкуется с разным начальным кодом - операционная система при запуске программы передает управление не твоим функциям, а к начальному коду, который уже запускает твою функцию. |
|||
|
||||
| Hagrael |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 26.6.2011 Репутация: нет Всего: нет |
bsa, признаться, я не очень понял. Раз он линкуется с разным кодом, то выходит, объектный код модифицируется? о_О
|
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Hagrael, Первой функцией выполняющейся в программе является не "main" и не "winmain".
Сначала выполняется библиотечная точка входа, которая делает несколько полезных вещей (инициализацию CRT переменных, разбиение управляющей строки на массив (char * argv[]) и проч.) и затем передает управление вашей функции "main" или "winmain". Изменяя тип приложения Console / GUI вы выбираете другой стартовый код. стартовый код GUI делает несколько другие вещи чем стартовый код Console, и в том числе вызывает не "main", а "WinMain" Стартовый код, можно изменить вручную в линковщике. В студии например это будет выглядеть так:
Теперь сразу будет выполняться функция int myfunc(); (вместо myfunc можете выбрать любое имя) Естественно ни "main", ни "WinMain" в этом случае выполняться не будут. ( если они не вызываются из myfunc(); ) Делать так не советую, так как в этом случае вы отказываетесь от инициализации CRT, и не сможете пользоватся многими библиотечными функциями. Показал только в качестве иллюстрации. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
объектный код генерирует компилятор (это файлы с расширением *.obj), а линкер соединяет объектные файлы и библиотеки и делает уже требуемый исполняемый или библиотечный файл. Так вот, в комлекте с компилятором (имеется в виду инструментарий необходимый для сборки программ, что-то вроде Platform SDK) идет несколько объектных файлов. Они нужны для соединения с разными видами проектов: dll, console, GUI... Это сообщение отредактировал(а) bsa - 24.7.2011, 16:57 |
|||
|
||||
| Hagrael |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 26.6.2011 Репутация: нет Всего: нет |
Понятно. Но что из себя представляет файл .obj? Начальную функцию? А мой код тоже превращается в .obj?
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Hagrael, почитай это:
http://forum.vingrad.ru/forum/topic-270683...eprocessor.html http://forum.vingrad.ru/index.php?show_typ...&kw=faq-c++ Объектный файл - это машинный код соответствующий твоей программе (точнее, той ее части, которая была в файле, из которого получился *.obj), но без связей с другими модулями. Все данные, необходимые для их организации, находятся в таблицах импорта и экспорта. Эти таблицы читаются линкером (компоновщиком) у всех объединяемых объектных файлов и библиотек (статическая библиотека - это в большинстве случаев просто архив объектных файлов), а затем происходит подстановка вместо символов из таблиц импорта каждого модуля соответствующие адреса из таблиц экспорта. В итоге получается уже работающий машинный код. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |