我读过一篇关于Calling convention
的文章(__ stdcall,__ fastcall,pascal,cdecl等...)
我想知道:为什么经常为WinMain()函数声明__stdcall(WinAPI)?
在我阅读时,__stdcall
使用堆栈进行操作,__fastcall
对寄存器进行操作而根本不使用堆栈。
所以,我试图用__fastcall
声明 WinMain()。编译器(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
,但这只是我的建议。
答案 0 :(得分:1)
您只能在您编写的函数上指定调用约定和/或您拥有源代码。 您无法更改库中的函数调用约定(静态/动态),因为它们已经编译/链接。 重要的是声明和定义具有相同的约定。
顺便说一句:你不会通过让(win-)main拥有fastcall约定来获得任何东西,因为它只被调用一次! 您可以考虑对具有许多小参数(适合寄存器)的函数进行快速调用,这些参数在很长的时间内经常被调用。Windows程序的(buildin)启动例程将使用特定约定调用WinMain或main(取决于GUI或控制台应用程序)。 如果您使用不同的约定编写WinMain或main,则链接器会抱怨。
答案 1 :(得分:0)
WinMain
必须为__stdcall
。它由CRT启动代码调用,该代码已经构建为以__stdcall
约定定义的方式传递参数。