我使用的是函数指针数组,并且我想将其直接与其关联的事件ID一起使用. 问题是,事件ID从0x10到0x1C,从0x90到0xA5.
我不想在开头写十个空元素,有没有可能这样声明:
int (*tab[256])(uint8_t *data, int *datalen) = {
NULL[10],
fun1,
[...],
funx,
NULL[116],
...
};
目前,我没有看到一个令人满意的解决方案,这就是为什么我问
我使用的是函数指针数组,并且我想将其直接与其关联的事件ID一起使用. 问题是,事件ID从0x10到0x1C,从0x90到0xA5.
我不想在开头写十个空元素,有没有可能这样声明:
int (*tab[256])(uint8_t *data, int *datalen) = {
NULL[10],
fun1,
[...],
funx,
NULL[116],
...
};
目前,我没有看到一个令人满意的解决方案,这就是为什么我问
您可以在标准C中使用designated initializers:
int (*tab[256])(uint8_t *data, int *datalen) = {
[0x10] = fun_a_1,
fun_a_2,
fun_a_3,
...
fun_a_n,
[0x90] = fun_b_1,
fun_b_2,
fun_b_3,
...
};
语法[n] = x
将数组的第n个元素设置为给定值.我们使用它来设置组中的第一个非空元素.然后在给定对象之后按顺序设置后续的初始化式,因此不需要 for each 初始化式显式指定索引.我们还可以利用未显式初始化的数组元素被设置为NULL
这一事实.
因此,在上面的示例中,元素0x10被显式设置为第一个函数指针.然后,初始化式列表中的下一个对象应用于元素0x11,下一个对象应用于0x12,依此类推.
虽然一些编译器可能支持一系列初始化器作为扩展,即[ 0 ... 9 ]
个,但上面的不依赖于这样的扩展,并且符合C标准.