全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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 接口的标准之一。

  • 参数同样从右到左压栈
  • 被调用方(callee)负责清理栈 —— 函数返回前执行 ret N(例如 ret 8 表示清理 8 字节参数),栈平衡由函数自身保证
  • 不支持可变参数(语法上允许声明,但链接或调用会出错;编译器通常报错)
  • 函数名修饰为 _funcname@N(前导下划线 + @ + 总参数字节数,如 _DrawTextA@20)

为什么栈清理责任不同会导致不兼容

本质是 ABI(Application Binary Interface)层面的契约断裂:

  • 若声明为 __stdcall 但按 __cdecl 调用:调用方不清理栈 → 每次调用栈指针 esp 偏移累积 → 栈溢出或后续变量访问错乱
  • 若声明为 __cdecl 但按 __stdcall 调用:函数内部执行 ret 12 清理,但实际只压了 4 字节 → esp 被过度修正 → 栈被“掏空”,返回地址错位 → 程序崩溃
  • 名字修饰不匹配 → 链接器找不到符号(LNK2019),因为 _foo@8 和 _foo 被视为两个不同函数

其他约定简要对比

__fastcall:前两个 DWORD(或寄存器宽度)参数通过 ECX、EDX 传递,其余压栈,callee 清栈;名字修饰为 @funcname@N。目标是减少访存,提升小函数性能。

__thiscall(MSVC 成员函数默认):this 指针放 ECX,其余参数从右到左压栈,callee 清栈(除可变参成员函数,此时 caller 清栈);名字修饰类似 __cdecl 或 __stdcall,取决于是否含可变参。

System V AMD64 ABI(Linux/macOS/x64 Windows):已统一为寄存器传参(RDI, RSI, RDX, RCX, R8, R9, R10, R11),浮点用 XMM0–XMM7,栈仅作备用和对齐;caller 清栈(但无需显式 add rsp),无名字修饰差异(C++ 仍需 mangling,但与调用约定无关)。


# linux  # word  # windows  # app  # 字节  # mac  #   # unix  # amd  # c++  # macos  # win  # 成员函数  # printf  # 可变参数  # 指针  # 接口  # Interface  # this  # microsoft  # 这是  # 下划线  # 不兼容  # 浮点  # 找不到  # 两种  # 不支持  # 报错  # 至关重要  # 传了 


相关文章: 建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  建站之星代理商如何保障技术支持与售后服务?  历史网站制作软件,华为如何找回被删除的网站?  建站之星好吗?新手能否轻松上手建站?  ui设计制作网站有哪些,手机UI设计网址吗?  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  已有域名能否直接搭建网站?  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  建站之星官网登录失败?如何快速解决?  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  建站之星安装提示数据库无法连接如何解决?  免费制作小说封面的网站有哪些,怎么接网站批量的封面单?  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  黑客入侵网站服务器的常见手法有哪些?  威客平台建站流程解析:高效搭建教程与设计优化方案  简历在线制作网站免费,免费下载个人简历的网站是哪些?  零基础网站服务器架设实战:轻量应用与域名解析配置指南  Python多线程使用规范_线程安全解析【教程】  如何获取PHP WAP自助建站系统源码?  制作门户网站的参考文献在哪,小说网站怎么建立?  建站之星安装步骤有哪些常见问题?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  Python如何创建带属性的XML节点  深圳网站制作培训,深圳哪些招聘网站比较好?  建站之星下载版如何获取与安装?  利用JavaScript实现拖拽改变元素大小  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  建站之星代理如何优化在线客服效率?  如何通过西部建站助手安装IIS服务器?  高端网站建设与定制开发一站式解决方案 中企动力  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?  网站建设设计制作营销公司南阳,如何策划设计和建设网站?  如何在云指建站中生成FTP站点?  济南专业网站制作公司,济南信息工程学校怎么样?  江苏网站制作公司有哪些,江苏书法考级官方网站?  已有域名建站全流程解析:网站搭建步骤与建站工具选择  如何快速搭建二级域名独立网站?  如何用PHP工具快速搭建高效网站?  如何在IIS中新建站点并解决端口绑定冲突?  微网站制作教程,我微信里的网站怎么才能复制到浏览器里?  建站之星后台管理:高效配置与模板优化提升用户体验  如何续费美橙建站之星域名及服务?  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  较简单的网站制作软件有哪些,手机版网页制作用什么软件?  金*站制作公司有哪些,金华教育集团官网? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。