2013-09-06 7 views
1

Я прочитал статью о Calling convention (__stdcall, __fastcall, паскаль, Cdecl и т.д ...)Что лучше объявить для вызова соглашения о программе Windows?

И мне интересно: Почему часто __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, но это только мое предложение.

ответ

1

Вы можете указать только соглашение о вызовах для функций, которые вы пишете, и/или у вас есть исходный код. Вы не можете изменять соглашения о вызовах функции, которые находятся в библиотеке (статические/динамические), поскольку они уже скомпилированы/связаны. Важно то, что декларация и определение имеют одно и то же соглашение.

BTW: вы ничего не выиграете, если у вас есть (win-) main, имеющих соглашение fastcall, поскольку он называется только один раз! Вы бы рассмотрели fastcall на функциях со многими небольшими параметрами (которые соответствуют регистрам), которые очень часто называются в течение длительных периодов времени.

Процедура запуска (buildin) для программ Windows вызовет либо WinMain, либо main (в зависимости от GUI или консольного приложения) с определенным соглашением. Если вы пишете WinMain или main с другим соглашением, то компоновщик будет жаловаться.

0

WinMain должно быть __stdcall. Он вызывается кодом запуска CRT, который уже построен для передачи параметров в порядке, определяемом соглашением __stdcall.