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

/*
	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 @ 2022-08-23 18:40  starc的miao  阅读(39)  评论(0)    收藏  举报