c++函数调用约定有哪些 c++ __cdecl, __stdcall区别【底层】

admin 百科 14
C++主流调用约定有__cdecl、__stdcall、__fastcall、__thiscall和__vectorcall;其中__cdecl由调用方清栈且支持可变参数,__stdcall由被调用方清栈且用于Win32 API,二者因栈清理责任和名字修饰不同导致ABI不兼容。

c++函数调用约定有哪些 c++ __cdecl, __stdcall区别【底层】-第1张图片-佛山资讯网

在 C++ 中,函数调用约定(Calling Convention)决定了函数调用时参数如何传递、栈由谁清理、函数名如何修饰等底层行为。这些约定直接影响二进制兼容性、跨语言调用(如 C++ 调用 Windows API 或 DLL)、以及汇编层的执行逻辑。

常见的 C++ 调用约定有哪些

主流调用约定包括:__cdecl__stdcall__fastcall__thiscall(MSVC 特有)、__vectorcall(VS2013+,用于向量化参数)。其中 __cdecl__stdcall 是最基础、最常被对比的两种,尤其在 Win32 平台和 ABI 兼容场景中至关重要。

__cdecl:C 语言默认约定,调用方清栈

这是 Microsoft Visual C++ 的默认调用约定(对普通 C/C++ 函数),也对应大多数 Unix-like 平台的 System V ABI(尽管命名不同,逻辑相似)。

  • 参数从右到左压栈(即最后一个参数先入栈)
  • 调用方(caller)负责清理栈空间 —— 这是关键区别:编译器在 call 指令后插入 add esp, N 指令,释放参数占用的栈空间
  • 支持可变参数函数(如 printf),因为只有调用方知道实际传了多少参数,才能正确清理
  • 函数名修饰为 _funcname(带前导下划线,无 @ 后缀)

__stdcall:Windows API 标准,被调用方清栈

这是 Win32 API 函数(如 MessageBoxA、CreateFileW)使用的约定,也是 COM 接口的标准之一。

立即学习“C++免费学习笔记(深入)”;

标签: linux word windows app 字节 mac unix amd c++ macos win micro

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~