回调函数和我们一般的函数有什么区别到底?难道区别就在于回调函数是操作系统调用的?
回调函数调用一般的函数吗?一般的函数是谁调用的
比如声明了WINAPI(__stdcall)是回调函数吗?比如这个DWORD WINAPI CAccess_to_opsrvDlg::udp_SendProc(LPVOID lpParamer)

解决方案 »

  1.   

    1)回调函数与普通函数没区别,回调函数同样可以在普通应用从程序中使用。
    2)操作系统使用的回调函数要声明为__stdcall,这是操作系统的约定而已;实际应用中也可以定义为__cdecl的格式。
    例如:typedef int (*CALL_BACK)(char*);int Test(char* pTest)
    {
    printf("%s", pTest);
    return 0;
    }void TestCallBack(CALL_BACK fun)
    {
    fun("Test");
    }
    int main(char** arv, int argc)
    {
    TestCallBack((CALL_BACK)Test);
    return 0; 
    }
      

  2.   

    回调函数和我们一般的函数有什么区别到底?难道区别就在于回调函数是操作系统调用的? 
    =====================================================
    在定义和写法上没有什么区别,关键字CALLBACK和WINAPI之类的东西也不过就是一些宏定义罢了,它的区别就是楼主说的,它的调用并不是由编程者自己在某个地方显式调用,而是由系统在适当的时候加以调用,它的参数也是由系统以合适的值传给它。比如定时器的回调函数,窗口处理函数,钩子的回调函数,最大的区别就是由系统来调用。回调函数调用一般的函数吗?一般的函数是谁调用的 
    =========================================
    第一句话没看懂,至于一般函数当然是编程者自己在某个地方显式调用了。比如声明了WINAPI(__stdcall)是回调函数吗?比如这个DWORD WINAPI CAccess_to_opsrvDlg::udp_SendProc(LPVOID lpParamer)
    ===================
    是不是回调函数并不是你自己对函数如何定义,回调函数用在什么地方,如何用,参数怎么写是系统决定的,并不是编程者决定的,比如WH_KEYBOARD钩子的回调函数,系统定义了它的格式和参数是下面这个样子的:
    LRESULT CALLBACK KeyboardProc(
      int code,       // hook code
      WPARAM wParam,  // virtual-key code
      LPARAM lParam   // keystroke-message information
    );
    所以你上面这个函数是不是回调函数,关键看它用在什么地方。不过你上面这个函数是不可能作回调的,因为类的非静态成员函数不能作回调函数。
      

  3.   


    回调函数和普通函数没有区别当计算机执行函数调用的时候,是通过call 函数所在地址这种方式来执行的当程序自己知道函数地址,如程序内部的函数,就是普通调用,当要外部提供函数地址的时候,就是回调调用
      

  4.   


    我的意思是回调函数不单单可以用于操作系统专用,也可以是普通程序。回调函数的类型可以是__stdcall,也可以是__cdecl,但操作系统API里面的回调函数的类型必须是__stdcall.
      

  5.   

    __stdcall==WINAPI,__cdecl是C语言(包括c++)默认的调用约定,只不过是规定了参数的入栈顺序和出栈操作有谁负责而已。这些和回调不回调有联系吗??再说了,回调不也是调用?就算是加了关键字CALLBACK的函数,我自己的程序代码在别的地方就不能调用了吗?
      

  6.   


    callback是过程化的,
    outgoing interface 对象化的,他们的目的都是给程序提供扩展功能。他们的特点是定义和实现分离。
      

  7.   

    孙鑫在深入详解中说,stdcall与cdecl的区别是入栈的顺序与出栈时由谁调用来区别的。具体怎样区别不是很懂。
      

  8.   

    楼上的认识恐怕不对。调用约定并非关键,只要调用者和被调用者能保持一致即可,具体是 stdcall 还是 cdecl 并非此处讨论的重点。如果调用一个函数时,调用约定不一致,普通函数调用一样存在回调函数会存在的问题。