注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

hhfighting的博客

以责人之心责己,以恕己之心恕人

 
 
 

日志

 
 
 
 

_stdcall 和 __cdecl  

2010-09-20 14:57:59|  分类: 专业知识 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
调用约定。
一般我们在声明函数时都没有显示的说明调用方式,因为不同语言都有不同的默认调用方式。_stdcall是Pascal程序的缺省调用方式,_cdecl是C语言调用中默认的函数修饰。
Windows函数的调用都需要用到栈,当函数调用完成后栈需要清楚,那么如何进行清除?
_stdcall 和 __cdecl的区别就在于栈的清除。
1、_cdecl :主调函数压栈,主调函数弹栈。
栈的清除工作是由调用者来完成的。用COM的术语来讲就是客户来完成的。
存在的问题:不同的编译器产生栈的方式不尽相同,调用者能否保证栈的清除工作顺利完成,是个值得考虑的问题。
由于每一个使用__cdecl约定的函数都要包含清理堆栈的代码,所以产生的可执行文件大小会比较大。
2、_stdcall:主调函数进行压栈,被调用函数弹栈。
栈的清除工作是由调用函数(指定为_stdcall的函数自身)自己解决清除工作。
问题:指定为_stdcall的函数只能根据他的参数表进行弹栈,故没有办法实现变参。
Win32的API函数都遵循_stdcall调用约定。
总结:
对于参数可变的函数(如 fprintf)来说,我们只能使用 _cdecl。因为参数是可变的,不定长的,被调用者事先无法知道参数的长度,事后的清除工作也无法正常的进行。
对于其他的函数应该最好考虑用_stdcall指定调用方式。
 
  评论这张
 
阅读(153)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018