据我所知,呼叫者和被叫者都需要有相同的呼叫约定。否则,堆栈可能已损坏。
WinMain是用__stdcall声明的,并调用我定义的所有函数。这是否意味着我定义的所有函数都应该使用stdcall调用约定?
我试过不使用__stdcall,但没有发生什么不好的事情。我还看到了著名的支持Windows的GUI库不使用stdcall。为什么堆不腐化?
发布于 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。为什么堆不腐化?
因为调用堆栈在每个函数调用和返回时都被正确地管理,所以不存在破坏堆栈的不平衡清理。
https://stackoverflow.com/questions/64821376
复制相似问题