当前位置:网站首页>函数调用约定
函数调用约定
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的一个原因了。
边栏推荐
猜你喜欢
随机推荐
原子的核型结构及氢原子的波尔理论
【Qt5 + OpenGL】glPointSize(10); error: undefined reference to `__imp_glPointSize‘
流程控制学习
写在光学之前--振动和波
Mysql two engines comparison
软件工程基础知识--软件过程模型
A Preliminary Study on Baidu Open Source e-chart
OpenCV - matchTemplate image template matching
抢占量化交易基金产品先机,量化投资有发展空间?
如何设计一个高并发系统?
注解与反射
Servlet life cycle
浅析Servlet三大容器的常用方法及其作用域
贝塞尔函数
DSPE-PEG-Aldehyde, DSPE-PEG-CHO, Phospholipid-PEG-Aldehyde MW: 1000
量化程序化交易如何去使用以及执行?
Seize the opportunity of quantitative trading fund products, and quantitative investment has room for development?
爱因斯坦的光子理论
异常学习笔记
Bessel function