为调用Windows程序的约定声明什么更好?

时间:2013-09-06 18:07:49

标签: c++ calling-convention stdcall winmain fastcall

我读过一篇关于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,但这只是我的建议。

2 个答案:

答案 0 :(得分:1)

您只能在您编写的函数上指定调用约定和/或您拥有源代码。 您无法更改库中的函数调用约定(静态/动态),因为它们已经编译/链接。 重要的是声明和定义具有相同的约定。

顺便说一句:你不会通过让(win-)main拥有fastcall约定来获得任何东西,因为它只被调用一次! 您可以考虑对具有许多小参数(适合寄存器)的函数进行快速调用,这些参数在很长的时间内经常被调用。

Windows程序的(buildin)启动例程将使用特定约定调用WinMain或main(取决于GUI或控制台应用程序)。 如果您使用不同的约定编写WinMain或main,则链接器会抱怨。

答案 1 :(得分:0)

WinMain必须为__stdcall。它由CRT启动代码调用,该代码已经构建为以__stdcall约定定义的方式传递参数。