如何声明含批量NULL元素块的函数指针数组以对应事件ID?
解决函数指针数组与非连续事件ID对应问题
你的写法NULL[10]是错误的——NULL是空指针,对它做下标访问属于未定义行为,编译或运行时都会出问题。针对你的需求,有两种靠谱的解决方案:
方案一:C99指定初始化器(推荐)
这是最简洁的方式,直接给对应事件ID的数组索引赋值,未指定的元素会自动初始化为NULL,完全不用手动填充前面的空元素:
#include <stdint.h> // 先定义函数指针类型,让代码更清晰 typedef int (*EventHandler)(uint8_t *data, int *datalen); EventHandler event_handlers[256] = { // 对应0x10到0x1C的事件ID [0x10] = handle_event_10, [0x11] = handle_event_11, // ... 依次填到[0x1C] = handle_event_1C, // 对应0x90到0xA5的事件ID [0x90] = handle_event_90, [0x91] = handle_event_91, // ... 依次填到[0xA5] = handle_event_A5 };
使用时直接通过事件ID作为索引访问数组即可:
uint8_t event_id = 0x10; if (event_handlers[event_id] != NULL) { event_handlers[event_id](data, &datalen); }
方案二:老编译器兼容方案(宏填充NULL)
如果你的编译器不支持C99,只能用宏来批量填充NULL,但这种方法比较繁琐,仅作备选:
// 定义宏批量生成NULL,这里以填充10个为例 #define FILL_10_NULLS NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL #define FILL_116_NULLS NULL,NULL,NULL,... /* 手动或用嵌套宏生成116个NULL */ int (*tab[256])(uint8_t *data, int *datalen) = { FILL_10_NULLS, fun1, fun2, ..., funx, // 对应0x10到0x1C的13个函数(0x1C-0x10+1=13) FILL_116_NULLS, fun90, fun91, ..., funA5 // 对应0x90到0xA5的22个函数(0xA5-0x90+1=22) };
显然这种方法远不如指定初始化器方便,所以优先推荐方案一。
内容的提问来源于stack exchange,提问作者mescande
相关产品推荐
相关产品推荐

