繁体   English   中英

Windows GUI 应用程序中的每个函数都需要使用 stdcall 吗?

[英]Does every function in a Windows GUI application need to use stdcall?

据我了解,调用者和被调用者都需要具有相同的调用约定。 否则,堆栈可能已损坏。

WinMain__stdcall声明并调用我定义的所有函数。 这是否意味着我定义的所有函数都应该使用stdcall调用约定?

我试过不使用__stdcall并且没有发生任何不好的事情。 我还看到支持 Windows 的著名 GUI 库不使用stdcall 为什么堆栈没有损坏?

WinMain 用__stdcall声明并调用我定义的所有函数。 这是否意味着我定义的所有函数都应该使用stdcall调用约定?

不。调用约定是在每个函数调用的基础上处理的,就在调用站点。 约定规定了调用者和被调用者如何管理调用堆栈——如何传递参数、以什么顺序、谁清理堆栈等。只要调用者和被调用者同意对每个单独的函数调用使用相同的调用约定, stdcall函数调用使用不同约定的函数(如cdecl是完全安全的,反之亦然。 函数的调用约定仅适用于:

  • 新调用者正在输入该函数。
  • 该函数正在返回给该调用者。
  • 该函数正在访问它自己的参数。

除此之外,函数在内部所做的与它自己的调用约定无关。

例如,假设WinMain() ,一个stdcall函数,想要调用一个cdecl函数。

WinMain()本身是一个stdcall函数,这完全无关紧要。 虽然代码执行在WinMain()内部,但它可以为所欲为。 WinMain()stdcall约定仅适用于WinMain()本身的进入和退出。 这就是WinMain()与 ITS 调用者的契约。

重要的是WinMain()在为即将调用的cdecl函数设置调用堆栈时必须遵循cdecl的规则,并在该函数返回WinMain()时清理调用堆栈。

这同样适用于任何调用约定的任何函数调用。

我试过不使用__stdcall并且没有发生任何不好的事情。 我还看到支持 Windows 的著名 GUI 库不使用stdcall 为什么堆栈没有损坏?

因为在每次函数调用和返回时都正确管理调用堆栈,所以没有不平衡的清理来破坏堆栈。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM