代替switch或if语句

参考文章,点击进入
image
适用性:
根据变量不同,执行函数不同;

参考文章,点击进入
三目运算符

c语言替代if或switch为函数指针数组形式,点击进入
(对文章代码做了修改)

点击查看代码
#include <stdio.h>
#include <stdlib.h>

#define SUCCESS 0
#define ERROR -1
#define SIZE(a) ((sizeof(a)) / (sizeof(a[0])))  //表的大小

typedef struct
{
	int event_id;    //event名称
	void *data;      //event的数据
	int datalen;     //event数据长度
} event_ind;

typedef int (*event_func)(event_ind *);    /* 主动上报函数类型 */

typedef struct {
	int event_id;             /* event名称 */
	event_func event_func;    /* event处理 */
} event_type;

typedef enum {
	/* RING */
	EVENT_RING = 0,
	/* ^SIMHOTPLUG */
	EVENT_SIM_HOT_PLUG,

	EVENT_END
} event_id_e_type;

static int RingEvent(event_ind* ind)
{
	printf("ring event\n");
	return SUCCESS;
}

static int SimHotPlugEvent(event_ind *ind)
{
	printf("sim hot plug event\n");
	return SUCCESS;
}

/* 上报EVENT */
static event_type g_event_ind[] = {
	{ EVENT_RING,            RingEvent },
	{ EVENT_SIM_HOT_PLUG,    SimHotPlugEvent }

};
// 第二步
event_type *event_get(int event_id)
{
	unsigned int i;
	printf("需要查找的event id:%d\n", event_id);

	printf("开始从表中查找支持的event id \n");
	for (i = 0; i < SIZE(g_event_ind); i++) {
		if(event_id == g_event_ind[i].event_id) {
			printf("查找到了 %d\n",g_event_ind[i].event_id);
			return &g_event_ind[i];
		}
	}
        printf("表中没查到event id\n");
	return NULL;
}
// 第一步
void init_event(event_ind * ind, int len)
{
	int id;
	scanf("%d",&id);
	printf("id is %d\n",id);
	ind->event_id = id;
	printf("event_id is %d\n",ind->event_id);
	//ind->data = NULL;
	//ind->datalen = 0;
	ind->data = (void *)malloc(len); //如果data是结构体,需要sizeof()
	memset(ind->data, 0, len);
	ind->datalen = len;
}

int main()
{
	event_type *event = NULL;
	event_ind *ind;
//	event_ind temp;
	int ret;

//	ind = &temp; //结构体指针赋值,直接给了局部变量的栈空间,也可以malloc

    ind = (event_ind *)malloc(sizeof(event_ind));
	memset(ind, 0, sizeof(*ind));

	/* 2021.4.8  没验证 */
	//ind->data = (void *)malloc(strlen(ind->data)); //如果data是结构体,需要sizeof()
	//memset(ind->data, 0, strlen(data));
	/* 2021.4.8  没验证 */
	
	/* event数据的初始化 */
	init_event(ind, 2);                                       // 第一步
	//printf("init end\n");

	/* 从表中查找支持的事件 */
	event = event_get(ind->event_id);                         // 第二步
	if (event == NULL) {
		return ERROR;
	}

	/* 处理上报事件event */
	ret = event->event_func(ind);                             // 第三部
	if(ret != SUCCESS) {
		return ERROR;
	}
	
	/* 2021.4.8  没验证 */
	if(ind->data) {
		free(ind->data);
	}
	/* 2021.4.8  没验证 */
    free(ind);
}



(文章用了数组来组织数据结构形式,也可以用链表组织数据结构)

c语言使用函数指针数组形式代替if、switch结构,点击进入
(没有判断条件,直接将所有函数放到一个数组里面,通过操作数组下标方式,调用了所有函数)

posted @ 2022-09-07 09:26  我爱茜茜公主  阅读(281)  评论(0)    收藏  举报