函数调用习惯与回调函数

函数调用习惯

     假设在C语言中,假设我们有这样的一个函数:


                int function(int a,int b)

       调用时只要用result = function(1,2)这样的方式就可以使用这个函数。但是,当高级语言被编译成计算机可以识别的机器码时,有一个问题就凸现出来:在CPU中,计算机没有办法知道一个函数调用需要多少个、什么样的参数,也没有硬件可以保存这些参数。也就是说,计算机不知道怎么给这个函数传递参数,传递参数的工作必须由函数调用者和函数本身来协调。为此,计算机提供了一种被称为栈的数据结构来支持参数传递。

       函数调用时,调用者依次把参数压栈,然后调用函数,函数被调用以后,在堆栈中取得数据,并进行计算。函数计算结束以后,或者调用者、或者函数本身修改堆栈,使堆栈复原。

       在参数传递中,有两个很重要的问题必须得到明确说明:
       1.当参数个数多于一个时,按照什么顺序把参数压入堆栈
      2.函数调用后,由谁来把堆栈复原
    
       在高级语言中,通过函数调用约定来说明这两个问题。常见的调用约定有:
               stdcall
               cdecl
               fastcall
               pascal
       type               参数入栈顺序           谁负责清栈
     _cdecl                righ-left                      caller  
     _fastcall            left-right                      callee
     _pascal             left-right                      callee
     _stdcall              right-left                     callee


原文出处,汇编代码没仔细看:

http://www.cnblogs.com/Dah/archive/2006/11/29/576867.html


回调函数 CALLBACK

       凡是由你设计却由windows系统呼叫的函数,统称为callback函数。某些API函数要求以callback作为你参数之一。如 SetTimer,LineDDA,EnumObjects。  

       回调函数是由开发者按照一定的原形进行定义的函数(每个回调函数都必须遵循这个原则来设计)  

       例如:  

                      BOOL CALLBACK DialogProc(   HWND hwndDlg, // handle of dialog box  

                                                                                     UINT uMsg, // message   

                                                                                      WPARAM wParam, // first message parameter  

                                                                                    LPARAM lParam // second message parameter   );   

    说明:  

                     1. 回调函数必须有关键词 CALLBACK;  

                     2. 回调函数本身必须是全局函数或者静态函数,不可定义为某个特定的类的成员函数,因成员函数有隐藏的this指针; 

                     3. 回调函数并不由开发者直接调用执行(只是使用系统接口API函数作为起点;  

                     4.  回调函数通常作为参数传递给系统API,由该API来调用,回调函数可能被系统API调用一次,也可能被循环调用多次。


参考文章,看的不是很懂,日后细细品味:

http://blog.youkuaiyun.com/phlexii/article/details/726033


  

PS:    retrieve:收回、检索      underlying:底层的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值