1

我读过一篇关于Calling convention(__stdcall、__fastcall、pascal、cdecl 等...)的文章

我想知道:为什么经常为 WinMain() 函数声明 __stdcall (WinAPI)?

正如我所读到的,使用__stdcall堆栈__fastcall进行操作,对寄存器进行操作,根本不使用堆栈。

所以,我试图. __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,但这只是我的建议。

4

2 回答 2

1

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

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

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

于 2013-09-06T18:26:14.913 回答
0

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

于 2013-09-06T18:29:27.077 回答