Что лучше объявить для соглашения о вызовах программы Windows?
Я прочитал статью о Calling convention
(__stdcall, __fastcall, паскаль, cdecl и т. д...)
И мне интересно: почему часто __stdcall (WinAPI) объявляется для функции WinMain()?
Пока я читаю, __stdcall
работает со стеком, __fastcall
работает с регистрами и не использует стек вообще.
Итак, я попытался объявить WinMain() с __fastcall
, Компилятор (Visual C++) выдал мне ошибку.
error C2373: 'WinMain' : redefinition; different type modifiers
c:\program files\microsoft sdks\windows\v6.0a\include\winbase.h(2560) : see declaration of 'WinMain'
Почему я не могу использовать __fastcall
для WinMain() и есть ли возможность использовать его для этого?
Потому что работать с регистрами без использования стека намного быстрее, не так ли?
PS Мое предложение состоит в том, что есть некоторые контракты метода, которые запрещают мне использовать __fastcall
, но это только мое предложение.
2 ответа
Вы можете указать соглашение о вызовах только для тех функций, которые вы пишете и / или у вас есть исходный код. Вы не можете изменить соглашения о вызовах функций, которые находятся в библиотеке (статические / динамические), так как они уже скомпилированы / связаны. Важно то, что декларация и определение имеют одинаковое соглашение.
Кстати, вы бы ничего не выиграли, если бы (win-)main имел конвенцию fastcall, поскольку она вызывается только один раз! Вы могли бы рассмотреть быстрый вызов для функций со многими небольшими параметрами (которые вписываются в регистры), которые очень часто вызываются в течение длительных периодов времени.
Процедура запуска (buildin) для программ Windows будет вызывать либо WinMain, либо main (в зависимости от графического интерфейса или консольного приложения) с определенным соглашением. Если вы пишете WinMain или main с другим соглашением, то компоновщик будет жаловаться.
WinMain
должно быть __stdcall
, Он вызывается кодом запуска CRT, который уже создан для передачи параметров способом, определяемым __stdcall
условность.