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

195
15 января 2019, 15:50

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

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

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

Answer 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 приложении

Answer 2

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

Которая может иметь разное имя для разных проектов.

WinMain - это просто соглашение, ничего мистически-сакрального в этом имени нет.

READ ALSO
C++ установить точность вычислений для double

C++ установить точность вычислений для double

имеется данный код, но он выводит не ожидаемый результаткак это исправить?

172
бесконечный цикл (scanf), не понимаю почему

бесконечный цикл (scanf), не понимаю почему

Как-то по-уродски код вставился

200
Как вывести большие(очень большие) числа?

Как вывести большие(очень большие) числа?

Мне нужно умножать очень большие числа, сделал это через алгоритм Карацубы, но переменные просто не могут их вместить в себяКак можно преодолеть...

184
Вывод массива в C++ (При сравнении массивов)

Вывод массива в C++ (При сравнении массивов)

Задается 2 массива a и b, нужно вывести массив имеющий наименьшее кол-во положительных элементовПример: Массив a { 1, 2,3}, массив b { -4, -5, 6} программа...

158