声明函数指针并实现回调

深度解析回调函数(易懂) 深度解析回调函数(易懂--适合收藏) 阅读详情
声明函数指针并实现回调  
 

程序员常常需要实现回调。本文将讨论函数指针的基本原则并说明如何使用函数指针实现回调。注意这里针对的是普通的函数,不包括完全依赖于不同语法和语义规则的类成员函数(类成员指针将在另文中讨论)。

声明函数指针

   回调函数是一个程序员不能显式调用的函数;通过将回调函数的地址传给调用者从而实现调用。要实现回调,必须首先定义函数指针。尽管定义的语法有点不可思议,但如果你熟悉函数声明的一般方法,便会发现函数指针的声明与函数声明非常类似。请看下面的例子:

void f();// 函数原型

上面的语句声明了一个函数,没有输入参数并返回void。那么函数指针的声明方法如下:

void (*) ();

   让我们来分析一下,左边圆括弧中的星号是函数指针声明的关键。另外两个元素是函数的返回类型(void)和由边圆括弧中的入口参数(本例中参数是空)。注意本例中还没有创建指针变量-只是声明了变量类型。目前可以用这个变量类型来创建类型定义名及用sizeof表达式获得函数指针的大小:

// 获得函数指针的大小
unsigned psize = sizeof (void (*) ());

// 为函数指针声明类型定义
typedef void (*pfv) ();

pfv是一个函数指针,它指向的函数没有输入参数,返回类行为void。使用这个类型定义名可以隐藏复杂的函数指针语法。

指针变量应该有一个变量名:

void (*p) (); //p是指向某函数的指针

   p是指向某函数的指针,该函数无输入参数,返回值的类型为void。左边圆括弧里星号后的就是指针变量名。有了指针变量便可以赋值,值的内容是署名匹配的函数名和返回类型。例如:

void func()
{
/* do something */
}
p = func;

p的赋值可以不同,但一定要是函数的地址,并且署名和返回类型相同。

传递回调函数的地址给调用者

   现在可以将p传递给另一个函数(调用者)- caller(),它将调用p指向的函数,而此函数名是未知的:

void caller(void(*ptr)())
{
ptr(); /* 调用ptr指向的函数 */
}
void func();
int main()
{
p = func;
caller(p); /* 传递函数地址到调用者 */
}

   如果赋了不同的值给p(不同函数地址),那么调用者将调用不同地址的函数。赋值可以发生在运行时,这样使你能实现动态绑定。

调用规范

   到目前为止,我们只讨论了函数指针及回调而没有去注意ANSI C/C++的编译器规范。许多编译器有几种调用规范。如在Visual C++中,可以在函数类型前加_cdecl,_stdcall或者_pascal来表示其调用规范(默认为_cdecl)。C++ Builder也支持_fastcall调用规范。调用规范影响编译器产生的给定函数名,参数传递的顺序(从右到左或从左到右),堆栈清理责任(调用者或者被调用者)以及参数传递机制(堆栈,CPU寄存器等)。

   将调用规范看成是函数类型的一部分是很重要的;不能用不兼容的调用规范将地址赋值给函数指针。例如:

// 被调用函数是以int为参数,以int为返回值
__stdcall int callee(int);

// 调用函数以函数指针为参数
void caller( __cdecl int(*ptr)(int));

// 在p中企图存储被调用函数地址的非法操作
__cdecl int(*p)(int) = callee; // 出错


   指针p和callee()的类型不兼容,因为它们有不同的调用规范。因此不能将被调用者的地址赋值给指针p,尽管两者有相同的返回值和参数列。  



























什么是函数回调?如何使用函数回调机制? 函数回调是一种将函数作为参数传递给另一个函数,在后者内部执行的机制。简而言之,它允许你动态地决定在什么时候调用哪个函数。事件处理:当特定事件发生时,调用相应的回调函数来处理事件。排序和过滤:在排序或过滤数据时,将自定义比较函数传递给排序或过滤函数。执行特定操作:根据条件执行不同的操作,而不需要大量的条件语句。然后,你需要定义一个函数指针,用于存储回调函数的地址。函数指针的类型必须与回调函数的原型匹配。这个函数指针callback可以存储一个接受两个指向常量数据的指针返回整数的函数的地址。 阅读详情

相关推荐

使用 C++ Builder 闭包作为回调的测试程序

接下来,我们将创建一个简单的测试程序,该程序将从给定的源文件中搜索类定义,使用闭包作为回调函数来处理找到的结果。要使上述代码能够成功编译和运行,你需要在编译器中正确配置 Boost 库,将文件路径替换为实际的源文件路径。现在,我们可以编写一个简单的回调函数来处理搜索结果。该函数接受两个参数:源文件的路径和一个闭包作为回调函数。模块来搜索类定义,使用 C++ Builder 的闭包作为回调函数。函数来搜索类定义,如果找到了匹配项,就调用回调函数传递类名。在上面的代码中,我们指定了源文件的路径,将。

PixelShadeZ的博客 222

回调函数(callback)是什么?一文理解回调函数(callback)

回调函数是一种特殊的函数,它作为参数传递给另一个函数,在被调用函数执行完毕后被调用。回调函数通常用于事件处理、异步编程和处理各种操作系统和框架的API。回调:指被传入到另一个函数的函数。异步编程:指在代码执行时不会阻塞程序运行的方式。事件驱动:指程序的执行是由外部事件触发而不是顺序执行的方式。回调函数的定义:回调函数是一个作为参数传递给其他函数的函数,它能够被异步调用以处理某些事件或完成某些任务。

Lion_Long的博客 7万+

jbpm3入门项目之环境搭建完整指南

JBoss jBPM(简称 jbpm)是一个基于 Java 的开源业务流程管理(BPM)引擎,由 JBoss 社区维护。它提供了流程建模、执行、监控和管理的完整解决方案,适用于构建复杂的企业级流程驱动型应用。jbpm3 是该项目早期的重要版本,尽管后续已被 jbpm4、jbpm5 及更现代的所取代,但其设计思想和核心理念仍是理解现代流程引擎的基础。</start></task></process>说明:start:流程的起始节点;task:需要“manager”角色执行的任务;

weixin_33240461的博客 1010

C++回调函数的基本理解和使用

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。 https://baike.baidu.com/item/%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0...

一度凡尘的专栏 9万+

从BPMN到XPDL--Visual Paradigm for UML 的流程转换

  Visual Paradigm for UML 7.2版本新增加了对BPMN到XPDL和JPDL的转换的支持,用公司的流程设计器测试了一下转换后的XPDL文件,虽然显示效果没有vp好看,但基本信息还是识别出来,看起来以后工作流用BPMN(设计)+XPDL(执行)会是一个不错的选择。业务人员和开发员可以用同一个流程定义。     Visual Paradigm for UML ...

small.che 746

jBPM4与BPMN2将于2010年1月联姻

继11月5日jBPM v4.2版本发布之后,jBPM又有了新的动向,Joram Barrez在他最新的博文中称:\自从今年夏天开始,我们就着手在PVM平台上实现对原生BPMN的支持……在本博文中大家将能窥见BMPN2当前的执行进展……它将整合在jBMP4.3中发布(原定日期是2010年1月1日)…… \这对流程开发社区来说无疑又是一大兴事,因为广大业务流程开发人员不再需要将由BPMN2建模的流程图...

cpongo5 141

JBPM,全称Java Business Process Management,是一个灵活且功能强大的工作流程管理系统

这种语言提供了一系列的术语,如任务(tasks)、待处理状态(waitstates)、计时器(timers)和自动处理动作(automated actions),以支持复杂的业务逻辑定义。jPDL 的主要优点在于它的图型化表示和丰富的控制结构,这使得它对于设计和实现复杂的业务流程管理非常有效。JBPM是一个开源的、灵活的、易于扩展的可执行流程语言框架,它覆盖了业务流程管理、工作流、服务协作等领域。总之,jPDL 是 jBPM 中的一个关键组件,它提供了一个强大且灵活的方式来定义和管理业务流程。

[Blog][Domain] programb.blog.csdn.net 638

JBPM是什么?

其流程定义采用自己定义的jPdl(JBoss jBPM Process definition language)语言,详细定义了状态图的每个部分,如起始、结束状态,以及状态之间的转换,通过图型化的流程定义,直观地描述业务流程。JBPM,全称是Java Business Process Management(业务流程管理),是一个开源的、灵活的、易扩展的可执行流程语言框架,它覆盖了业务流程管理、工作流、服务协作等领域。业务流程模型就是图形化对象的网状图,包括活动和用于定义这些活动执行顺序的。

m0_74390904的博客 1006

常见的工作流框架 Activity JBPM

常用工作流框架有Activity、JBPM、OSWorkFlow、WorkFlow 一、BPMN2.0规范 BPMN(Business Process Model and Notation)--业务流程模型与符号。 BPMN是一套流程建模的标准,主要目标是被所有业务用户容易理解的符号,支持从创建流程轮廓的业务分析到这些流程的最终实现,知道最终用户的管理监控。 通俗一点其实就是一套规范,画流程模型的规范。流程模型包括:流程图、协作图、编排图、会话图。详细信息请google。 Activi..

ejinxian的专栏 2019

Activiti的基本介绍

Activiti简介 Activiti 是由 jBPM 的创建者 Tom Baeyens 离开 JBoss 之后建立的项目,构建在开发 jBPM 版本 1 到 4 时积累的多年经验的基础之上,旨在创建下一代的 BPM 解决方案。 Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,通过api进行流程调度。 Activiti 作为一个遵从 Apac...

爪哇菌的博客 3万+

Activiti笔记(三) —— Activiti与JBPM概念和差异(整理和汇总)

Activiti概念 一、Activiti特点 1、数据持久化 activiti 设计思想:简洁、快速。使用mybatis 2、原生支持spring 方便集成spring进行事务管理 3、流程设计 eclipse插件安装后有流程设计器,方便使用。 4、引擎接口 提供了7个引擎接口,方便调用 二、Activiti核心组件 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ltm0OCZp-1602811390087)(https://ask.qcloudimg.com/http-s

成长笔记 1090

工作流

对jBPM来说,今年最大的事件莫过于jBPM的创建者Tom Baeyens离开JBoss了。Tom Baeyens离开的具体原因尚不清楚,但他的离开产生了两个结果:一是jBPM的下一个版本jBPM5完全放弃了jBPM4的基础代码,基于Drools Flow重头来过;二是Tom Baeyens加入Alfresco后很快推出了新的基于jBPM4的开源工作流系统Activiti。由此不难推测Tom Bae

u011607686的博客 414

Alfresco发布Activiti项目——基于Apache 2许可的BPM引擎

本周一,知名的企业内容管理(ECM)系统提供商Alfresco Software 发布了开源的业务流程管理(BPM)项目——Activiti,该项目由jBPM创建者,前JBoss jBPM领导与BPM权威Tom Baeyens主持大局。前jBPM团队成员Joram Barrez此前也加入了该项目,成为Activiti的核心开发人员。长久以来,Alfresco一直将jBPM嵌入到其产品当中,今后也将...

cpongo5 1144

activiti简单介绍

Activiti简介 Activiti 是由 jBPM 的创建者 Tom Baeyens 离开 JBoss 之后建立的项目,构建在开发 jBPM 版本 1 到 4 时积累的多年经验的基础之上,旨在创建下一代的 BPM 解决方案。 Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,通过api进行流程调度。 Activiti 作为一个遵从 Apache ...

xiaoyaGrace的博客 414

jbpm3概览

前段时间选用JBPM来做为未来项目的工作流引擎,JBPM的版本目前主要是3,4,5,因为4在很多时候有BUG,且 官方的的documentation也是不推荐的,所以没有去看4的一些相关信息,版本5中的内容比较新,融入的东西也比较多,特别是对BPMN标准的支持,但是因为内容过多,学习的曲线度也比较大,所以从tom研发的JBPM3着手,3,4,5的三个版本几乎是完全不一样的,不可能完全的掌握,...

jonlee123的专栏 445

轻量级工作流jBPM-4.3官方“开发指南”中文版

jBPM-4.3这次升级的重头戏都放在开发指南里了,添加的最大特性功能就是对BPMN 2.0的实现,基于PVM实现了对BPMN 2.0的运行实现,只要给jbpm多配置一套发布器就可以同时使用jPDL和BPMN 2.0里。   其余的,还添加了对JMS的支持,添加了Drools规则引擎的支持,添加了使用Java调用EJB的功能,重写了Spring与jBPM-4的整合代码,现在jBPM-4终于可以...

xyz20003的专栏 320

jBPM5 RFC译

jBPM5 RFC(请求评论文档) 原文:http://community.jboss.org/wiki/jBPM5RequestforComments 译:liuu 2010-05-06   本文论述关于jBPM5的整体架构和关键特性,我们热烈欢迎感谢关于本文的任何反馈(包括那些你认为应该包含,但在文档中没有提到的内容)。让我们了解你最关心的,找出最重要的,以便我们安排优先级。这将作为...

liuu 233
上一篇: 得到计算机的主机名和IP地址
下一篇: 主页制作动态技术
jeffreyren
博客等级 码龄26年 8粉丝 36原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值