[英]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.