回调函数的使用:案例一:c语言简单信号与槽机制。

文章介绍了回调函数的基本概念,通过函数指针调用函数,并提供了简单的C++实现示例。同时,文章还展示了如何实现一个简单的信号与槽机制,包括信号的初始化、添加槽函数、发射信号和销毁。最后,通过一个测试函数展示了如何使用这些机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系列文章目录



前言

了解回调函数的基本概念,函数指针的使用、简单信号与槽的实现机制;


一、回调函数

1.1 回调函数基本概念

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。

A “callback” is any function that is called by another function which takes the first function as a parameter。
也就是说,函数 F1 调用函数 F2 的时候,函数 F1 通过参数给 函数 F2 传递了另外一个函数 F3 的指针,在函数 F2 执行的过程中,函数F2 调用了函数 F3,这个动作就叫做回调(Callback),而先被当做指针传入、后面又被回调的函数 F3 就是回调函数。

在这里插入图片描述

1.2 简单实现

创建函数指针,指向指定函数。

void hanshus1()
{
    cout <<"my hanshus1"<<endl;
}

int hanshus2(int)
{
    cout <<"my hanshus2"<<endl;
    return 0;
}

void (*hanshu1)();
int (*hanshu2)(int);
int main()
{
    hanshu1 = hanshus1;
    hanshu1(); // 输出 " my hanshus1 "
    hanshu2 = hanshus2;
    hanshu2(2); // 输出 “my hanshus2”
}

二、代码案例

简单实现信号与槽机制:
参考代码:
https://blog.csdn.net/weixin_41374099/article/details/115687655

1.代码示例

代码如下(示例):

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
using namespace std;

#define MAX_SLOT_FUNCTION 20  //一个信号最多连接的槽函数数 //一个函数可以被任意多个信号连接

//槽函数类型
typedef void (*slot_t)();

//信号类型
typedef struct _signal_t 
{
	slot_t slot[MAX_SLOT_FUNCTION];
	int count; //槽函数数量
}signal_t;

//信号初始化
signal_t* signal();

//添加槽函数
void connect(signal_t* _signal, slot_t _slot);

//发射信号
void emit(signal_t* _signal);

//销毁
void del(signal_t* _signal);

//信号初始化
signal_t* signal() 
{
	signal_t* s = (signal_t*)malloc(sizeof(signal_t));
	s->count = 0;
	for (int i = 0; i < MAX_SLOT_FUNCTION; ++i) 
	{
		s->slot[i] = NULL;
	}
	return s;
}

//添加槽函数
void connect(signal_t* _signal, slot_t _slot)
{
	_signal->slot[_signal->count] = _slot;
	++_signal->count;
}

//发射信号
void emit(signal_t* _signal) 
{
	for (int i = 0; i < _signal->count; ++i)
	{
		slot_t  func = _signal->slot[i];
		if (func != NULL) // 
		{
			func();
		}
	}
}

//销毁
void del(signal_t* _signal) {
	for (int i = 0; i < _signal->count; ++i)
	{
		_signal->slot[i] = NULL;
	}
	_signal->count = 0;
	free(_signal);
}

//准备几个槽函数!!!
void setup()
{
	static int i = 0;
	printf("setup > 我被点击了%d次,啊啊啊啊\n", ++i);
}

void draw() 
{
	static int i = 0;
	printf("draw > 我被点击了%d次,啊啊啊啊\n", ++i);
}

void loop()
{
	static int i = 0;
	printf("loop > 我被点击了%d次,啊啊啊啊\n", ++i);
}

void test() 
{
	//自定义信号
	signal_t* clicked = signal();
	signal_t* moved = signal();
	
	connect(clicked, setup);
	connect(clicked, draw);
	connect(clicked, loop);

	connect(moved, setup);
	connect(moved, draw);

	//发射信号
	printf("---------------------------------------\n");
	emit(clicked);
	emit(clicked);

	printf("---------------------------------------\n");

	emit(moved);
	emit(moved);
	emit(moved);

	printf("---------------------------------------\n");
	emit(clicked);
	emit(clicked);
	emit(clicked);

	printf("---------------------------------------\n");


}
int main()
{
	test();
	return 0;
}

运行截图:
在这里插入图片描述


总结

  • 回调函数和普通函数的区别;
  • 函数指针的使用
  • 信号与槽的机制
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暴躁茹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值