gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:37:58 24 4
gpt4 key购买 nike

使用不同调用约定的关键因素是什么?有人什么时候知道使用特定的调用约定,例如 __cdecl__stdcall__fastcall在不同的场合。

例子会非常有用。

最佳答案

大多数时候你不需要担心它。通常你会使用 __cdecl ,但这只是因为这是 Visual C++ 中的默认设置。然而,C++ 成员函数使用 __thiscall Visual C++ 中的默认约定

您真正需要担心调用约定的(相当常见的)情况是当您将回调传递给 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 .

虽然 __stdcall传递给 WinAPI 函数的回调函数是必需的,接受可变数量参数的函数必须使用 __cdecl调用约定,因为只有调用者知道如何从堆栈中正确弹出可变数量的参数。自 __cdecl通常是默认值,您不需要明确指定 __cdecl对于接受可变数量参数的函数。

我个人还没有找到 __fastcall 的用途,虽然我确定有人有。
__clrcall仅当您与托管代码交互时才相关。

关于visual-c++ - 何时使用调用约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3405022/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com