Почему WinMain должна использовать __stdcall?

у меня возник вопрос почему точка входа в WinApi должна иметь соглашение о вызове __stdcall? Я знаю, что при разных соглашениях о вызовах по разному управляется стек, а так же функции имеют разные идентификаторы, но мне все равно не понятно почему это именно так? Какова техническая причина данного правила, если она есть? Заранее спасибо за ответ :)


Ответы (1 шт):

Автор решения: KoVadim

Как я писал - краткий ответ - так случилось.

Полный чуточку интереснее. Многие думают, что main/WinMain - это и есть точка входа в программу. Но это не так в большинстве случаев. На самом деле эта функция вызывается далеко не самой первой. Вначале запускается CRT (он же RunTime, он же стартовый код, и ещё много названий). Этот код инициализирует статические переменные, подготавливает окружение (тот же cin/cout), а по выходу с main производит обратный процесс, вызывает всякие atexit.

И понятно, что весь этот код рассчитывает на какие-то соглашения, говоря другим языком "API". Но почему именно __stdcall, а не какой то другой? а все очень просто. Какое то соглашение нужно было обязательно. И какое же возьмем? правильно, наше, которое мы для себя сделали и везде в WinAPI используем - __stdcall

The __stdcall calling convention is used to call Win32 API functions. The callee cleans the stack, so the compiler makes vararg functions __cdecl. Functions that use this calling convention require a function prototype. The __stdcall modifier is Microsoft-specific.

(выделения мои)

Ещё на почитать https://docs.microsoft.com/en-us/cpp/build/reference/entry-entry-point-symbol?view=msvc-160

→ Ссылка