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

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

简述


大家都知道,在C语音中指针的地位很重要,各种指针,功能很强大!但是用不好,指针也比较容易出问题。


这里介绍的是函数指针的一种应用方法,即使用函数指针来实现消息命令的注册与回调处理。


代码


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

#include <stdio.h>
#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 <stdio.h>
#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


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


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


源代码码云地址:https://gitee.com/fensnote/demo_code/tree/master/c/test_func_point


目录
相关文章
|
2月前
|
C语言
C语言中条件操作符的应用
最后,条件操作符是个超级英雄,但不是每个代码问题都需要一个超级英雄来解决。一定要在适当的时候适度的使用它,那么它将成为你的编程工具箱中的一件强力工具。
245 75
|
4月前
|
存储 人工智能 Java
一文轻松拿捏C语言的指针的基础使用
本文介绍了C语言中的指针概念,包括直接访问和间接访问内存的方式、指针变量的定义与使用、取址运算符`&`和取值运算符`*`的应用,帮助读者深入理解指针这一C语言的核心概念。君志所向,一往无前!
78 0
|
6月前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
220 3
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
6月前
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
782 9
|
6月前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
162 7
|
7月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
169 5
|
7月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
7月前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
149 1
|
7月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
163 1
|
7月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
606 13