Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

Точка входа в программу

#cpp #функции #visual_cpp


Почему при точке входа WinMain/wWinMain не запускается консоль. А при точке входа
main - запускается. Как это работает? 

И как компилятор понимает, что WinMain/wWinMain является точкой входа, если стандартной
является main. Как работать с точкой входа main без запуска консоли, используя заголовочный
файл windows.h? 

Ещё хотелось бы спросить, где можно найти про это структурированную информацию (почитать
про это, как это работает).
    


Ответы

Ответ 1



как компилятор понимает что WinMain/wWinMain является точкой входа, если стандартной является main Стандарт лишь определяет, что компилятор обязан поддерживать использование точки входа с прототипом int main(int argc, char **argv). Стандарт не запрещает поддерживать любые другие точки входа. В случае Visual C++, точка входа определяется параметрами компоновщика /SUBSYSTEM и /ENTRY. Когда параметр /SUBSYSTEM имеет значение "WINDOWS", а параметр /ENTRY не определен, точкой входа является функция WinMain. Как работать с точкой входа main без запуска консоли Установив параметры компоновщика /ENTRY:"mainCRTStartup" /SUBSYSTEM:WINDOWS. В диалоговом окне свойств проекта эти параметры расположены в "Linker - Advanced - Entry point" и "Linker - System - Subsystem" соответственно. Подробное описание принципов выбора точки входа можно прочитать здесь: точка входа в win32 приложении

Ответ 2



Понимает не компилятор, а линковщик. Когда он выполняет линковку для той или иного формата файла - консоли, оконного приложения или чего еще - он прилинковывает некий объектный файл с кодом стартапа, который выполняет инициализацию всяких вещей, как-то разбор кормандной строки и всякое другое, а потом, выполнив подготовку среды выполнения, вызывает ту самую "главную" функцию. Которая может иметь разное имя для разных проектов. WinMain - это просто соглашение, ничего мистически-сакрального в этом имени нет.

Комментариев нет:

Отправить комментарий