基于C语言的函数指针应用-消息命令处理框架

简述

大家都知道,在C语音中指针的地位很重要,各种指针,功能很强大!但是用不好,指针也比较容易出问题。
这里介绍的是函数指针的一种应用方法,即使用函数指针来实现消息命令的注册与回调处理。

代码

测试的处理函数,这里为了测试,都是空函数:

#include 
#include "test_msg_proc.h"void proc_msg_reg(int cmd, const void *pData, int len)
{printf("in proc_msg_reg  , cmd: %d, data: %s, data len: %d\n", cmd, (const char *)pData, len);//处理数据
}void proc_msg_login(int cmd, const void *pData, int len)
{printf("in proc_msg_login, cmd: %d, data: %s, data len: %d\n", cmd, (const char *)pData, len);//处理数据
}void proc_msg_test(int cmd, const void *pData, int len)
{printf("in proc_msg_test , cmd: %d, data: %s, data len: %d\n", cmd, (const char *)pData, len);//处理数据
}

函数指针定义:

//函数指针
typedef void (*pfunc)(int , const void *, int );

消息处理节点信息结构体:

//消息处理节点信息结构体
typedef struct MsgProcNodeInfo
{int cmd;          //消息名字char name[64];    //用于存储消息名字,方便调试pfunc func;   //处理回调函数
}MsgProcNodeInfoSt;

接下来是一个消息信息结构体的数组定义,也就是关键部分,消息命令的注册表:

//消息处理注册表,注册命令字与其对应的处理函数
static  MsgProcNodeInfoSt msgMap[]=
{{0, "regCmd",   proc_msg_reg},{1, "loginCmd", proc_msg_login},{2, "testCmd",  proc_msg_test},
};

主处理函数,用于根据命令字在注册表里查找对应的处理函数,然后回调处理。这里面有个小技巧,如果命令字与数组索引正好是一致的,那可以直接拿命令字作为数组的下表去索引对应的节点调用其函数指针即可。

//处理函数
void proc_msg(int cmd, const void *pData, int len)
{
#if 1//处理int i = 0; for ( i = 0; i < sizeof(msgMap)/sizeof(MsgProcNodeInfoSt); i   ){if ( msgMap[i].cmd != cmd )continue;if ( msgMap[i].func == NULL )continue;msgMap[i].func(cmd, pData, len);}#else     //如果命令字正好与数组索引相同,也可以这样取巧,直接拿命令字作为索引用if ( cmd >= sizeof(msgMap)/sizeof(MsgProcNodeInfoSt) ) //越界判断return;msgMap[cmd].func(cmd, pData, len);
#endif    
}

主函数:

#include 
#include "test_msg_proc.h"int main(int argc, char **argv)
{proc_msg(0, "注册", sizeof("注册"));proc_msg(1, "登录", sizeof("登录"));proc_msg(2, "测试", sizeof("测试"));return 0;
}

编译运行结果

编译:

[fens@fens app/test_func_point]$make 
gcc -Wall  -I. -c main.c -o main.o 
gcc -Wall  -I. -c test_msg_proc.c -o test_msg_proc.o 
gcc ./main.o ./test_msg_proc.o -o test -Wall  -I. -lpthread
strip test

运行:

[fens@fens app/test_func_point]$./test
in proc_msg_reg  , cmd: 0, data: 注册, data len: 7
in proc_msg_login, cmd: 1, data: 登录, data len: 7
in proc_msg_test , cmd: 2, data: 测试, data len: 7

从上面的打印可以看出,命令字处理的时候都对应到了注册的回调函数。

在实际用时,数据的内容可以是十六进制数据,命令字也可以改为字符串格式。

声明:

本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338922.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

easyexcel 动态列_easyexcel动态表头列导出SequenceDiagram 阅读源码事半功倍

EasyExcel简介Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存&#xff0c;poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题&#xff0c;但POI还是有一些缺陷&#xff0c;比如07版Excel解压缩以及解压后存储都是…

python3进阶_Python3 进阶教程 2020全新版

REVENGE_7771天前如果不创建class类的话&#xff0c;直接使用dog.name是会报错的&#xff0c;因为一般数据类型不接受这种调用方式0赞 0采集潘某人永不屈服2天前class Student()定义的时候&#xff0c;需要在括号内写明继承的类Person在__init__()方法&#xff0c;需要调用sup…

C语言中的输入输出

在C语言中提供了许多内置的输入输出函数。标准文件的定义在C语言中会把所有设备当文件来处理。为了访问键盘和屏幕&#xff0c;以下三个文件会在程序执行时而打开。标准文件文件指针设备标准输入stdin键盘标准输出stdout屏幕标准错误stderr屏幕C 语言中的输入/输出通常使用内置…

lambda 延迟执行_Java Lambdas和低延迟

lambda 延迟执行总览 有关在Java和低延迟中使用Lambda的主要问题是&#xff1a; 他们会产生垃圾吗&#xff0c;您能做些什么吗&#xff1f; 背景 我正在开发一个支持不同有线协议的库。 这个想法是&#xff0c;您可以描述要写入/读取的数据&#xff0c;并且有线协议确定它是否…

C语言“悬空指针”和“野指针”究竟是什么意思?

各位&#xff0c;提起C语言我们很自然就会想到指针二字&#xff0c;没错&#xff0c;作为C的核心和灵魂&#xff0c;它的地位咱们就不再赘述了&#xff0c;今天我们想跟大家讲的是指针中的两个特有名词&#xff1a;“悬空指针”和“野指针”。悬空指针C语言中的指针可以指向一块…

grad在python什么模块_深度学习(Deep Learning)基础概念1:神经网络基础介绍及一层神经网络的python实现...

此专栏文章随时更新编辑&#xff0c;如果你看到的文章还没写完&#xff0c;那么多半是作者正在更新或者上一次没有更新完&#xff0c;请耐心等待&#xff0c;正常的频率是每天更新一篇文章。 该文章是“深度学习&#xff08;Deep Learning&#xff09;”系列文章的第一部分&…

ubuntu终端命令停止_从命令行关闭Linux计算机的5种方法

没有操作系统是完美的。 即使相对稳定,驱动程序和应用程序也可能存在问题。 Linux也不例外。 尽管比Windows更稳定(在许多情况下,并非全部!),但可能还需要重新启动Linux计算机。 这可能是因为某些东西不起作用。 或者,您可能通过SSH连接到远程计算机或服务器,并希望它重新…

C语言编写简单朗读发音小工具!!

各位&#xff0c;今天给大家带来C语言结合VBS脚本写的一个简单的朗读小工具&#xff0c;做一个能够发音的C语言程序&#xff08;保证简单&#xff0c;人人都能学会&#xff09;。具备的知识体系&#xff1a;C语言基本框架C语言输入输出C语言文件操作C语言system函数VBS指令&…

未发现oracle(tm)客户端和网络组件_SpringColud Eureka的服务注册与发现

一、Eureka简介本文中所有代码都会上传到git上&#xff0c;请放心浏览 项目git地址&#xff1a;https://github.com/839022478/Spring-Cloud在传统应用中&#xff0c;组件之间的调用&#xff0c;通过有规范的约束的接口来实现&#xff0c;从而实现不同模块间良好的协作。但是被…

sap寄售退货单_多个退货单

sap寄售退货单我曾经听说过&#xff0c;过去人们一直在努力使方法具有单个出口点。 我知道这是一种过时的方法&#xff0c;从未认为它特别值得注意。 但是最近我与一些仍坚持该想法的开发人员联系&#xff08;最后一次是在这里 &#xff09;&#xff0c;这让我开始思考。 因此…

课堂经验值管理小程序_微信小程序怎么管理门店?

微信门店小程序是一种不用注册下载就能使用的购物平台&#xff0c;近年来很是流行&#xff0c;而且它操作简单&#xff0c;能让用户快速找到自己需要的产品&#xff0c;然后进行购买&#xff0c;深得用户喜爱&#xff0c;有用户的地方就会有商家&#xff0c;商家想拥有自己的微…

C语言 | 直接插入排序

解题思路&#xff1a;直接插入排序是一种最简单的排序方法&#xff0c;其基本操作是将一条记录插入到已排好的有序表中&#xff0c;从而得到一个新的、记录数量增1的有序表。C语言源代码演示&#xff1a;#include//头文件 int main()//主函数 {void insort(int post[],int n)…

mysql+after+commit_Spring事务aftercommit原理及实践

来道题CREATE TABLE goods (id bigint(20) NOT NULL AUTO_INCREMENT,good_id varchar(20) DEFAULT NULL,num int(11) DEFAULT NULL,PRIMARY KEY (id),KEY goods_good_id_index (good_id)) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ciClass.forName("c…

序列化和反序列化的概念_序列化的概念

序列化和反序列化的概念讨论了为什么Optional不可序列化以及如何处理&#xff08;即将推出&#xff09;之后&#xff0c;让我们仔细看看序列化。 总览 这篇文章介绍了序列化的一些关键概念。 它尝试精简地执行此操作&#xff0c;而不会涉及太多细节&#xff0c;包括将建议降至…

C语言必学的12个排序算法:基数排序

# 基本思想基数排序(radix sort)&#xff0c;同样时一种非比较的内部排序算法&#xff0c;主要基于多关键字排序的思想进行排序&#xff0c;它将单个关键字按照基数分成“多个关键字”进行排序。例如整数789是一个关键字&#xff0c;可以按照十进制位划分多关键字&#xff08;十…

有没有code能改xml内容_Spring源码解析-applicationContext.xml加载和bean的注册

applicationContext文件加载和bean注册流程​ Spring对于从事Java开发的boy来说&#xff0c;再熟悉不过了&#xff0c;对于我们这个牛逼的框架的介绍就不在这里复述了&#xff0c;Spring这个大杂烩&#xff0c;怎么去使用怎么去配置&#xff0c;各种百度谷歌都能查到很多大牛教…

C语言数据类型转换

首先变量的数据类型是可以转换的。转换的方法有两种&#xff0c;一种是自动转换&#xff0c;另一种是强制转换。自动转换即当不同类型的数据进行混合运算时&#xff0c;编译系统将按照一定的规则自动完成。而强制类型转换是由程序员通过编程强制转换数据的类型。自动转换的规则…

java 类持久化_Java 持久化之 -- IO 全面整理(看了绝不后悔)

目录&#xff1a;一、java io 概述什么是IO&#xff1f;IO包括输入流和输出流&#xff0c;输入流指的是将数据以字符或者字节形式读取到内存 分为字符输入流和字符输入流输入流指的是从内存读取到外界 &#xff0c;分为字符输入流和字节输出流Java IO即Java 输入输出系统。不管…

idea 找不到或无法加载主类_解决IDEA中Groovy项目no Groovy library is defined的问题

实验环境IDEA2019.1.2Groovy-2.5.8错误重现新建了一个Groovy工程&#xff0c;指定了groovy版本&#xff0c;如图新建了一个简单的Groovy Class&#xff0c;运行&#xff0c;出现如下错误错误的尝试(以下是试错过程&#xff0c;并不能解决问题&#xff0c;读者可以不要跟着操作&…

C语言标识符、关键字和注释

这一节主要讲解C语言中的几个基本概念。标识符定义变量时&#xff0c;我们使用了诸如“a”“abc”“mn123”这样的名字&#xff0c;它们都是程序员自己起的&#xff0c;一般能够表达出变量的作用&#xff0c;这叫做标识符&#xff08;Identifier&#xff09;。标识符就是程序员…