当前位置:网站首页>函数调用约定
函数调用约定
2022-08-09 14:52:00 【Nicolas0311】
整理笔记的时候发现的函数调用约定笔记,但是忘了在哪看到的了。
__cdecl 是C/C++和MFC程序默认使用的调用约定,也可以在函数声明时加上__cdecl关键字来手工指定。采用__cdecl约定时,函数参数按照从右到左的顺序入栈,并且由调用函数者把参数弹出栈以清理堆栈。因此,实现可变参数的函数只能使用该调用约定。由于每一个使用__cdecl约定的函数都要包含清理堆栈的代码,所以产生的可执行文件大小会比较大。__cdecl可以写成_cdecl。
__stdcall 调用约定用于调用Win32 API函数。采用__stdcal约定时,函数参数按照从右到左的顺序入栈,被调用的函数在返回前清理传送参数的栈,函数参数个数固定。由于函数体本身知道传进来的参数个数,因此被调用的函数可以在返回前用一条ret n指令直接清理传递参数的堆栈。__stdcall可以写成_stdcall。
__fastcall 约定用于对性能要求非常高的场合。__fastcall约定将函数的从左边开始的两个大小不大于4个字节(DWORD)的参数分别放在ECX和EDX寄存器,其余的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的堆栈。__fastcall可以写成_fastcall。
__stdcall 调用约定相当于16位动态库中经常使用的PASCAL调用约定。在32位的VC++5.0中PASCAL调用约定不再被支持(实际上它已被定义为__stdcall。除了__pascal外,__fortran和__syscall也不被支持),取而代之的是__stdcall调用约定。两者实质上是一致的,即函数的参数自右向左通过栈传递,被调用的函数在返回前清理传送参数的内存栈,但不同的是函数名的修饰部分(关于函数名的修饰部分在后面将详细说明)。_stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中,函数采用从右到左的压栈方式,自己在退出时清空堆栈。VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上”@”和参数的字节数。
特别说明
1. 在默认情况下,采用__cdecl方式,因此可以省略.
2. WINAPI一般用于修饰动态链接库中导出函数
3. CALLBACK仅用于修饰回调函数
4. 你可能已经发现,VC下和BCB下对WINAPI的定义不同,那么你至少理解了为什么不能直接从BCB下调用VC的dll的一个原因了。
边栏推荐
猜你喜欢
随机推荐
[MySql]实现多表查询-一对一,一对多
突然想分析下房贷利率及利息计算
怎么才可以知道量化程序化交易是否有效?
程序化交易规则对于整个交易系统有什么意义?
常见的四种电阻之间有什么不同?
Seize the opportunity of quantitative trading fund products, and quantitative investment has room for development?
Mongodb增加权限管理
Database multi-table link query method
英语议论文读写01 Business and Economics
一些需要思考的物理问题
CV复习:BatchNorm
Similar image detection method
C语言——函数、参数和指针
流程控制学习
Technology Sharing | How to Handle Header Cookies in Interface Automation Testing
EasyExcel的应用
对程序化交易系统接口有什么误区?
docker安装单机版redis、集群版redis
6大论坛,30+技术干货议题,2022首届阿里巴巴开源开放周来了!
Servlet的生命周期









