关闭

浅谈C/C++回调函数(Callback)& 函数指针

1834人阅读 评论(1) 收藏 举报
分类:

摘要:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。


按照上面的说法,实现一个C Language的回调函数如下,

#include <stdio.h>
//回调函数
int ADD(int (*callback)(int,int), int a, int b){
	return (*callback)(a,b);//此处回调add函数...
}
//普通函数
int add(int a, int b){
	return a + b;
}

int main(void){
	printf("%d\n",add(1,2));
	printf("%d\n",ADD(add,1,2));
	return 0;
}

从上面的定义及其实现可以看出,回调函数必须有函数指针的存在,而这里函数指针一般可以先typedef一下,然后再使用,

一般格式: 返回值 (*指针名) (参数列表)

#include <stdio.h>

//返回值(*指针名)(参数列表)
typedef int (*callback)(int,int);
//回调函数
int ADD(callback p, int a, int b){
	return (*p)(a,b);//此处回调add函数...
}
//普通函数
int add(int a, int b){
	return a + b;
}

int main(void){
	printf("%d\n",add(1,2));
	printf("%d\n",ADD(add,1,2));
	return 0;
}

可是,根据上面的例子,回调函数搞得这么麻烦,貌似并没有什么大作用.....纠结!

别纠结,来看一下库函数中的sort排序是怎么弄的。algorithm它提供了某些排序算法的实现(如冒泡排序、快速排序、shell排序、shake排序等等),为了能让库更加通用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,能让库可用于多种数据类型(int、float、string),此时,该怎么办呢?可以使用函数指针,并进行回调,如下:

#include <stdio.h>
#include <algorithm>

bool cmp(int a, int b){
	return a > b;
}
int main(void){
	int a[8] = {5,43,1,7,8,13,0,74};
	std::sort(a,a+10,cmp);//callback
	return 0;
}
这里只是提及了一下库函数中的排序问题,如果想了解更多,可以去看一下《泛型编程与C++标准模板库 : 浅谈sort()排序函数》这篇文章。

0
0
查看评论

c++callback回调实例

静态库文件: Func.h: #ifndef _Func_H #define _Func_H #endif #include "stdafx.h" #include using namespace std; typedef int(*pFunc)(int para...
  • u011555996
  • u011555996
  • 2017-07-26 15:12
  • 465

C++中回调(CallBack)的使用方法

回调函数是一个很有用,也很重要的概念。当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数。回调函数在windows编程使用的场合很多,比如Hook回调函数:MouseProc,GetMsgProc以及EnumWindows,DrawState的回调函数等等,还有很多系统级的回调过程。 一般...
  • force_eagle
  • force_eagle
  • 2009-07-14 13:48
  • 24599

C++11新特性之 CALLBACKS

《C++11新特性之std::function》提到了std::function作为回调函数。今天主要讨论不同情况下std::function作为回调使用。使用回调#include <functional> #include <iostream> namespace { us...
  • wangshubo1989
  • wangshubo1989
  • 2015-11-04 21:58
  • 4741

C++中回调(CallBack)的使用方法

回调函数是一个很有用,也很重要的概念。当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数。回调函数在windows编程使用的场合很多,比如Hook回调函数:MouseProc,GetMsgProc以及EnumWindows,DrawState的回调函数等等,还有很多系统级的回调过程。 一般...
  • huangyimo
  • huangyimo
  • 2017-09-22 16:51
  • 200

Callback在C\C++中的实现

Callback是这样的一类对象(在这里不能简单的理解为"回调函数"了):你注册一个函数,以及调用它时的参数,希望在满足某个条件时,以这些注册的函数调用这个回调,完成指定的操作. 很多地方会使用到这个概念.比如,UI程序中,注册一个函数,当某个鼠标事件发生的时候自动调用;比...
  • weiqubo
  • weiqubo
  • 2013-11-27 15:45
  • 2464

c++回调函数 callback

C++中实现回调机制的几种方式 (1)Callback方式 Callback的本质是设置一个函数指针进去,然后在需要需要触发某个事件时调用该方法, 比如Windows的窗口消息处理函数就是这种类型。比如下面的示例代码,我们在Download完成时需要触发一个通知外面的事件: typed...
  • xie1xiao1jun
  • xie1xiao1jun
  • 2012-12-05 23:03
  • 41447

C/C++中Windows API 简单的(Callback)回调机制

C/C++中Windows API 简单的(Callback)回调机制
  • qq78442761
  • qq78442761
  • 2017-07-01 10:55
  • 2593

C++ Dll 中的回调(CallBack)

2011-05-09 16:09:15|  分类: 工作 |  标签:dll  int  callback  回调  |举报|字号 订阅 &...
  • lusic01
  • lusic01
  • 2017-02-20 14:53
  • 314

C#调用c++dll时,关于回调函数

1、C#调用c++dll时,关于回调函数参数的问题。 c++  DLL.h #ifdef __cplusplus extern "C" { #endif extern int C_Start(); extern int C_SetResultCallback(C...
  • iamherego
  • iamherego
  • 2016-01-04 22:59
  • 3510

C++ 回调函数理解

编程中肯定会遇到在C++中使用回调函数的情况。 但是为什么要使用回调函数呢?我们需要理解回调函数设计原理 因为可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。 如果想知道回调函数在实际中有什么作用,先假...
  • clirus
  • clirus
  • 2015-12-18 13:49
  • 4298
    个人资料
    • 访问:1076831次
    • 积分:4696
    • 等级:
    • 排名:第7353名
    • 原创:71篇
    • 转载:0篇
    • 译文:0篇
    • 评论:48条
    最新评论