代替switch或if语句
参考文章,点击进入

适用性:
根据变量不同,执行函数不同;
参考文章,点击进入
三目运算符
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结构,点击进入
(没有判断条件,直接将所有函数放到一个数组里面,通过操作数组下标方式,调用了所有函数)
如果,感到此时的自己很辛苦,那告诉自己:容易走的都是下坡路。坚持住,因为你正在走上坡路,走过去,你就一定会有进步。如果,你正在埋怨命运不眷顾,开导自己:命,是失败者的借口;运,是成功者的谦词。命运从来都是掌握在自己的手中,埋怨,只是一种懦弱的表现;努力,才是人生的态度。

浙公网安备 33010602011771号