今天看了回调函数发现有个__stdcall与cdecl 非常不解求助!!!

mihonghang 2005-07-11 11:45:20
rt
...全文
334 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
oyljerry 2005-07-12
  • 打赏
  • 举报
回复
__stdcall通用调用约定
__cdecl vc默认的调用约定
蒋晟 2005-07-12
  • 打赏
  • 举报
回复
cdecl 参数从右至左入栈,函数负责清除堆栈,返回值的处理如下
VC:
除了浮点数之外的基本类型和大小小于或者等于8字节的结构根据大小不同保存在EAX或者EAX:EDX组合中
浮点数和双精度数保存在fp0中
大小超过8字节的,或者有构造函数、析构函数、虚函数之一的结构或者类在内存中返回。返回值在内存中时调用者会分配对应大小的内存,并且将其作为隐含的第一个参数传递。函数调用之后调用者负责清除这块内存。
其它:
某些编译器在按值传递有析构函数的类和结构时会强制转换成按地址传递。某些编译器会把所有返回值强制放在内存中

stdcall
同cdecl,但是函数调用者负责清除堆栈

thiscall
VC:
同stdcall,但是this指针在ECX中传递,类和结构类型的返回值强制放在内存中。如果函数参数的数目可变,那么同cdecl,但是this指针成为隐含的第一个参数。
其它:
同stdcall,但是this指针成为隐含的第一个参数。

fastcall
除了开始两个大小小于4字节的参数会通过寄存器传递之外,其它同cdecl。

64位平台上调用约定有所变化,但是我没有做过这方面的研究。

参考文章
http://support.microsoft.com/default.aspx/kb/100832
http://p5.club.163.com/viewArticleByWWW.m?boardId=clanguage&articleId=clanguage_104ffea50e53121&boardOffset=0
http://www.codeproject.com/cpp/FastDelegate.asp
newbiestar 2005-07-12
  • 打赏
  • 举报
回复
同楼上

cdecl是C语言里面函数调用使用得最多的协议(可以说绝大多数都是这个,Unix/Linux下面清一色都是这个……),主要特性是使用eax寄存器保存返回值(通常对于比较小的类型如此),调用方清栈(所以可以支持变参函数),另外它也是C/C++默认的调用协议(也就是说不额外声明的话,默认就是cdecl的)

stdcall是Windows API标准的调用方式,所有的Windows API都是靠这个调用协议,好像一般callback也都是用这个的……
qrlvls 2005-07-11
  • 打赏
  • 举报
回复
调用约定,使用不同的调用约定,则传递参数的顺序和方式会不同,例如多个参数的入栈顺序会不同,而象__fastcall约定会尽可能的使用寄存器传递参数
因此如果一个__stdcall声明的函数通过__cdecl的方式去调用就会出现错误

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧