visual-c – 何时使用调用约定

visual-c – 何时使用调用约定,第1张

概述使用不同调用约定的关键因素是什么?什么时候有人知道在不同的场合使用特定的调用约定,例如__cdecl或__stdcall或__fastcall. 实例将是真正适用的. 大多数时候你不需要担心它.通常你会使用__cdecl,但这只是因为它是Visual C中的默认值.但是,C成员函数在Visual C中默认使用__thiscall约定 一个(相当普遍的)情况,你真的不得不担心调用约定是当你将回调传递 使用不同调用约定的关键因素是什么?什么时候有人知道在不同的场合使用特定的调用约定,例如__cdecl或__stdcall或__fastcall.

实例将是真正适用的.

解决方法 大多数时候你不需要担心它.通常你会使用__cdecl,但这只是因为它是Visual C中的默认值.但是,C成员函数在Visual C中默认使用__thiscall约定

一个(相当普遍的)情况,你真的不得不担心调用约定是当你将回调传递给API函数时,就像在Windows API中那样:

// CALLBACK is #define'd as __stdcall LRESulT CALLBACK MyWndProc(HWND hwnd,UINT msg     WParaM wParam,LParaM lParam); // ... windowClass.lpfnWndProc = &MyWndProc; ::RegisterClass(&windowClass);

在这里,我们将MyWndProc()声明为具有__stdcall约定(CALLBACK是#define’d as __stdcall).这是必需的,因为 *** 作系统期望lpfnWndProc指向WNDPROC,which uses the CALLBACK convention.

几乎每个接受回调的windows API函数都要求回调函数使用__stdcall约定,并且由于__cdecl通常是默认值,因此必须使其显式(您可以使用CALLBACK进行窗口过程).

这非常重要,因为如果 *** 作系统尝试调用非-__ stdcall函数,则可能发生堆栈损坏.不幸的是,足够的人弄错了Windows will actually check for calling convention mismatch specifically for window procedures.

虽然传递给WinAPI函数的回调函数需要__stdcall,但接受可变数量参数的函数必须使用__cdecl调用约定,因为只有调用者才知道如何正确地从堆栈中d出可变数量的参数.由于__cdecl通常是默认值,因此您不需要为接受可变数量参数的函数显式指定__cdecl.

我个人还没有找到__fastcall的用途,虽然我确信有人有.

只有在与托管代码交互时,__ clrcall才有意义.

总结

以上是内存溢出为你收集整理的visual-c – 何时使用调用约定全部内容,希望文章能够帮你解决visual-c – 何时使用调用约定所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1237329.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存