转移表-函数指针列表搭建程序框架

/*
Function:函数指针数组
*/
// 头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 宏定义
#define CMD_FUNC1 "func1"
#define CMD_FUNC2 "func2"
#define CMD_FUNC3 "func3"
#define MAX_BUF_SIZE 128
#define MAX_SOCK_SIZE 1024
#define INDEX_UNKNOWN -1
// 函数声明
void func1(int n);
void func2(int n);
void func3(int n);
void commandHandler(void);
int commandNum(void);
// 自定义数据类型
typedef struct
{
int num;
char cmd[MAX_BUF_SIZE];
// ***
}CommandData;
// 自定义函数类型
typedef struct
{
char *command;
void (*command_func)(int); // 需要与子函数类型匹配
}CommandInfo;
// 函数转移表
static CommandInfo commands[] = {
{CMD_FUNC1, &func1}, // 指令,函数
{CMD_FUNC2, &func2},
{CMD_FUNC3, &func3}
};
/**********************
主函数
**********************/
CommandData gCmdData; // 全局函数
int main()
{
// 手动配置参数
strcpy(gCmdData.cmd, "func3");
gCmdData.num = 23;
// 参数处理函数
commandHandler();
return 0;
}
// 计算表长度
int commandNum(void)
{
return sizeof(commands) / sizeof(CommandInfo);
}
/**********************
处理函数
**********************/
void commandHandler(void)
{
// 获取配置参数
CommandData *data = &gCmdData;
//char * data = CMD_FUNC3;
int i;
int cmd_bool;
int pos = INDEX_UNKNOWN;
for (i = 0; i < commandNum(); i++)
{
cmd_bool = (0 == strncmp(commands[i].command, data->cmd, strlen(commands[i].command))); // 不要 *data
if (cmd_bool)
{
pos = i;
break;
}
}
if (INDEX_UNKNOWN == pos)
{
printf("error pos\n");
return;
}
commands[pos].command_func(data->num); //
}
/**********************
子函数
**********************/
void func1(int n)
{
printf("func1: %d\n", n);
}
void func2(int n)
{
printf("func2: %d\n", n);
}
void func3(int n)
{
printf("func3: %d\n", n);
}
posted @   steve的miao  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示