zoukankan      html  css  js  c++  java
  • C89:论回调函数

    一.简介

    使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数

    而那个函数需要利用传递的地址来调用回调函数

    例如我们在调用某个API函数的时候,可以把回调函数的地方传递给API,API函数会在某个特定条件下调用回调函数

    假如我们要写一个函数供别人使用,但是并不知道数据类型,可以为每种类型写一个重载函数实现多态,但这是C++专有的.而回调函数需要让调用者自己准备数据类型,这样我们写的函数就可以调用别人写的函数知道数据类型

    回调函数是由别人的函数执行时调用你实现的函数

    消息机制也是一种回调函数,假如进程B收到进程A发送的消息,调用了一个函数,又向进程A发送消息,这个函数就是回调函数

    机制:

    (1)定义一个回调函数

    (2)提供函数实现,并将回调函数的函数指针注册给调用者

    (3)当特定的事件或条件发生时,调用者使用函数指针调用回调函数对事件进行处理

    二.函数指针

    回调在C语言中是通过指针来实现的,通过将回调函数的指针传给被调函数,从而实现回调

    // b.cpp
    
    // 回调函数,被其他函数调用
    void fCallback(char* s)
    {
        ...
    }
    
    // a.cpp
    
    typedef void(*pcb)(char*);
    
    void GetCallBack(pcb callback)
    {
        ...
    }
    
    GetCallBack(fCallback);
    

    三.示例

    C语言的标准库中很多地方采用了回调函数来让用户自定义处理过程,如常用的快速排序函数 二分搜索函数等

    •  (1)快速排序函数

    void qsort

    (

        void* base,

        size_t nelem,

        size_t width,

        int (_USERENTRY* fcmp)(const void*, const void*)

    );

    // 快速搜索函数
    
    #include <stdio.h>
    #include <stdlib.h>
    
    
    int sort_function(const void* a,const void* b);
    
    int list[5] = {54, 21, 11, 67, 22};
    
    int main()
    {
    	int x;
    	qsort((void*)list, 5, sizeof(list[0]), sort_function);
    
    	for(x = 0; x < 5; x++)
    		printf("%d ", list[x]);
    	
    	system("pause");
    
    	return 0;
    }
    
    int sort_function(const void* a, const void* b)
    {
    	return *(int*)a-*(int*)b;
    }
    
    • (2)二分搜索函数
    void* bsearch
    
    (
    
        const void* key,
    
        const void* base,
    
        size_t nelem,
    
        size_t width,
    
        int (_USERENTRY* fcmp)(const void*, const void*)
    
    );
    
  • 相关阅读:
    netty的基本使用
    netty 实现简单的rpc调用
    NIO 的基本使用
    BIO实现 Socket 通信
    springboot使用ElasticSearch
    docker-compose安装rabbitmq集群(主从集群---》镜像集群)
    杂谈:面向微服务的体系结构评审中需要问的三个问题
    使用Spring Boot和RxJava的构建响应式REST API
    JVM体系结构详解
    如何成为更好的程序员?
  • 原文地址:https://www.cnblogs.com/k5bg/p/11088086.html
Copyright © 2011-2022 走看看