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*)

);
原文地址:https://www.cnblogs.com/k5bg/p/11088086.html