全网整合营销服务商

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

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

C++中的函数调用约定有哪些?__cdecl与__stdcall的区别【底层知识】

__cdecl与__stdcall的核心区别在于栈清理责任:__cdecl由调用方清栈,__stdcall由被调函数清栈;两者压栈顺序均为从右向左,但名字修饰不同(__cdecl为\_Func,__stdcall为\_Func@N),影响链接与动态调用。

Windows平台下C++函数调用约定主要有 __cdecl__stdcall__fastcall__thiscall__vectorcall(较新版本VC支持)。其中最基础、最常被问及的是 __cdecl__stdcall,它们的核心差异在于谁来清理栈空间参数压栈顺序——而这直接关系到函数能否被正确调用、链接和导出。

参数压栈顺序:两者完全一致

__cdecl 和 __stdcall 都采用从右向左的压栈顺序。例如:

func(a, b, c);

实际入栈顺序是:c → b → a。这点没有区别,不必担心调用时参数错位。

栈平衡责任:关键区别所在

函数调用后,栈指针(ESP)必须恢复到调用前位置,这个“清理栈”的动作由谁完成,决定了调用约定的本质差异:

  • __cdecl:由调用方(caller)负责清栈。编译器在每次调用后生成 add esp, N 指令(N为参数总字节数)。
  • __stdcall:由被调用函数(callee)负责清栈,即函数返回前执行 ret N(带立即数的 ret 指令),自动修正栈顶。

这意味着:同一个函数如果声明为 __stdcall 却被按 __cdecl 方式调用(或反之),会导致栈失衡——轻则局部变量错乱,重则程序崩溃,且问题往往延迟暴露,极难调试。

名字修饰(Name Mangling)规则不同

为了支持函数重载和调用约定识别,编译器会对函数名进行修饰。两者典型规则如下(以32位x86为例):

  • __cdecl:函数名前加一个下划线,如 _MyFunc;若带参数,不体现参数大小,仍为 _MyFunc
  • __stdcall:函数名前加下划线,**后缀加 @ + 参数总字节数**,如三个 int 参数(12字节)→ _MyFunc@12

因此,在 .def 文件导出、GetProcAddress 动态获取、或混用 C/C++ 与汇编时,必须严格匹配调用约定,否则链接器报 “unresolved external” 或运行时报 “procedure not found”。

适用场景与默认行为

  • __cdecl 是 C/C++ 默认调用约定(除非显式指定),尤其适合可变参数函数(如 printf),因为只有调用方知道实际传了多少参数,必须由它清栈。
  • __stdcall 主要用于 Windows API 函数(如 MessageBoxA、CreateWindowEx),也是 COM 接口的标准约定。它减少调用方代码体积(无需每处都清栈),利于接口统一。
  • __fastcall 尝试用寄存器(ECX、EDX)传前两个DWORD参数,其余仍压栈;__thiscall 是非静态成员函数的默认约定(this 指针通常放 ECX)。

基本上就这些。理解它们不是为了手写汇编,而是读懂链接错误、排查崩溃、正确使用 Win32 API 或编写 DLL 导出函数时的关键底层支撑。


# word  # windows  # cad  # 字节  #   # c++  # win  # 区别  # 成员函数  # printf  # 局部变量  # 可变参数  # int  # 指针  # 接口  # 函数重载  # this  # 下划线  # 的是  # 均为  # 会对  # 为例  # 而这  # 谁来  # 关系到  # 主要用于  # 新版本 


相关文章: 安徽网站建设与外贸建站服务专业定制方案  武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?  建站之星如何通过成品分离优化网站效率?  红河网站制作公司,红河事业单位身份证如何上传?  如何批量查询域名的建站时间记录?  建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南  如何在西部数码注册域名并快速搭建网站?  外贸公司网站制作哪家好,maersk船公司官网?  如何在Ubuntu系统下快速搭建WordPress个人网站?  广平建站公司哪家专业可靠?如何选择?  清除minerd进程的简单方法  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  建站之星安装后界面空白如何解决?  C++如何使用std::optional?(处理可选值)  电商网站制作公司有哪些,1688网是什么意思?  如何在新浪SAE免费搭建个人博客?  如何在IIS中配置站点IP、端口及主机头?  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?  制作门户网站的参考文献在哪,小说网站怎么建立?  如何在万网ECS上快速搭建专属网站?  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?  股票网站制作软件,网上股票怎么开户?  为什么Go需要go mod文件_Go go mod文件作用说明  建站之星图片链接生成指南:自助建站与智能设计教程  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  建站之星后台管理:高效配置与模板优化提升用户体验  大学网站设计制作软件有哪些,如何将网站制作成自己app?  如何通过VPS搭建网站快速盈利?  建站之星安装失败:服务器环境不兼容?  北京企业网站设计制作公司,北京铁路集团官方网站?  建站之星如何配置系统实现高效建站?  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  如何通过wdcp面板快速创建网站?  Android自定义listview布局实现上拉加载下拉刷新功能  教学论文网站制作软件有哪些,写论文用什么软件 ?  微信小程序 input输入框控件详解及实例(多种示例)  建站之星代理平台如何选择最佳方案?  网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?  高端建站三要素:定制模板、企业官网与响应式设计优化  如何在阿里云香港服务器快速搭建网站?  微信推文制作网站有哪些,怎么做微信推文,急?  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  深圳网站制作平台,深圳市做网站好的公司有哪些?  网站制作费用多少钱,一个网站的运营,需要哪些费用?  如何通过云梦建站系统实现SEO快速优化?  如何通过西部建站助手安装IIS服务器?  唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱? 

您的项目需求

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