首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows GUI应用程序中的每个函数都需要使用stdcall吗?

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

Stack Overflow用户
提问于 2020-11-13 13:00:31
回答 1查看 102关注 0票数 0

据我所知,呼叫者和被叫者都需要有相同的呼叫约定。否则,堆栈可能已损坏。

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

我试过不使用__stdcall,但没有发生什么不好的事情。我还看到了著名的支持Windows的GUI库不使用stdcall。为什么堆不腐化?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-13 18:08:07

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

不是的。呼叫会议是在每个功能调用的基础上处理的,就在呼叫站点。该约定规定调用方和被调用方如何管理调用堆栈--如何传递参数、以何种顺序、谁清理堆栈等。只要调用方和被调用方同意对每个单独的函数调用使用相同的调用约定,stdcall函数调用使用不同约定(如cdecl )的函数是完全安全的,反之亦然。函数的调用约定仅适用于以下情况:

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

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

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

WinMain()本身就是一个stdcall函数,这一点都不重要。当代码执行在WinMain()中时,它可以做它想做的任何事情。WinMain()stdcall约定仅适用于WinMain()本身的进出,即WinMain()与其调用方的合同。

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

对于任何调用约定的任何函数调用也是如此。

,我试过不使用__stdcall,但没有发生什么不好的事情。我还看到了著名的支持Windows的GUI库不使用stdcall。为什么堆不腐化?

因为调用堆栈在每个函数调用和返回时都被正确地管理,所以不存在破坏堆栈的不平衡清理。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64821376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档