有充分的理由吗?
它们的内部函数(未导出)是否也是标准调用约定?
它是对 32 位代码的帕斯卡调用约定的改编。Pascal 是 OS/2 和 Windows 3 等 16 位操作系统的调用约定。为什么选择 pascal 有点猜测,即使我当时还是一只小狗,但它的效率略高。当您只需要使用 640 KB 时,这很重要。
大多数 Win32 函数不是真正的 stdcall,因为它还规定了导出函数在呈现给链接器之前如何修饰。就像 void Mumble(int arg) 变成 _Mumble@4。@ 后面的数字描述了激活帧的大小。但是大多数 Win32 函数都是在没有任何修饰的情况下导出的。可能是为了给程序员一个使 GetProcAddress() 工作的机会。我认为装饰旨在帮助链接器检测声明的 API 函数签名与实际函数签名之间的不匹配。传递的参数数量不匹配是一种自动 kaboom,因为被调用者会从堆栈中弹出或多或少的参数然后被传递。也很难诊断。stdcall 的一个弱点,cdecl 约定没有这个问题。
内部调用是 stdcall、cdecl 和 thiscall 之间的混合包。不能说我曾经检测到一种模式,尽管单步 Windows 代码不是我喜欢做的事情。
使用 stdcall 编译的代码明显小于使用 cdecl 编译的代码(替代方法)。在做出决定时,更小的代码是更快的代码。