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

在 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
还木有评论哦,快来抢沙发吧~