mes*_*nde 3 c function-pointers stack-memory
我正在使用函数指针数组,并且我想直接将其与其关联的事件 ID 一起使用。问题是,事件 ID 从 0x10 开始到 0x1C,从 0x90 到 0xA5。
我不想在开始时写十个 NULL 元素,是否可以以某种方式声明如下:
int (*tab[256])(uint8_t *data, int *datalen) = {
NULL[10],
fun1,
[...],
funx,
NULL[116],
...
};
Run Code Online (Sandbox Code Playgroud)
目前,我没有看到令人满意的解决方案,这就是我问的原因
您可以使用指定的初始值设定项在标准 C 中执行此操作:
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,
...
};
Run Code Online (Sandbox Code Playgroud)
该语法[n] = x将数组的第 n 个元素设置为给定值。我们用它来设置组中的第一个非 NULL 元素。随后的初始值设定项会在给定对象之后按顺序设置,因此您无需显式指定每个初始值设定项的索引。我们还可以利用未显式初始化的数组元素被设置为 的事实NULL。
因此,在上面的示例中,元素 0x10 被显式设置为第一个函数指针。然后,初始化器列表中的下一个对象应用于元素 0x11,下一个对象应用于 0x12,依此类推。
虽然某些编译器可能支持一系列初始值设定项作为扩展,即[ 0 ... 9 ],上述内容不依赖于此类扩展并且符合 C 标准。