提问人:mescande 提问时间:11/8/2023 更新时间:11/8/2023 访问量:104
如何声明带有 NULL elems 块的指针数组
How can I declare an array of pointers with blocks of NULL elems
问:
我正在使用函数指针数组,我想将其直接与它们的关联事件 ID 一起使用。 问题是,事件 ID 从 0x10 到 0x1C,从 0x90 到 0xA5。
我不想在开头写十个 NULL elems,有没有可能以某种方式这样声明:
int (*tab[256])(uint8_t *data, int *datalen) = {
NULL[10],
fun1,
[...],
funx,
NULL[116],
...
};
目前,我没有看到一个令人满意的解决方案,这就是我问的原因
答:
2赞
Brian61354270
11/8/2023
#1
如果您使用的是 C99 或更高版本(或者使用 GCC 作为编译器并在启用 GNU 扩展的情况下进行编译),则可以使用指定的初始值设定项来表达这一点。例如:
int (*tab[256])(uint8_t *data, int *datalen) = {
[0 ... 9] = NULL, /* optional, requires GNU extension */
[0x10] = fun1,
[0x11] = fun2, /* additional designators are optional after the first in sequence */
/* ... */ /* only the first designator '[0x10] =' is required. */
[0x1C] = funN,
[0x90] = funa,
/* ... */
[0xA5] = funz, /* again, '[0xA5] =' is optional when listing values in sequence. */
};
没有初始值设定项的条目将隐式初始化为 。0
评论
0赞
tstanisl
11/8/2023
[0 ... 9] = NULL,
部分是冗余的
0赞
Brian61354270
11/8/2023
@tstanisl正确,它在答案中是这样注释的,并在最后一句话中提到。
5赞
dbush
11/8/2023
#2
您可以在标准 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,
...
};
语法将数组的第 n 个元素设置为给定值。我们用它来设置组中的第一个非 NULL 元素。然后,后续初始值设定项将按给定对象之后的顺序进行设置,因此无需为每个初始值设定项显式指定索引。我们还可以利用未显式初始化的数组元素设置为 .[n] = x
NULL
因此,在上面的示例中,元素 0x10 被显式设置为第一个函数指针。然后,初始值设定项列表中的下一个对象将应用于元素 0x11,下一个对象将应用于 0x12,依此类推。
虽然某些编译器可能支持一系列初始值设定项作为扩展,即 ,但上述内容不依赖于此类扩展,并且符合 C 标准。[ 0 ... 9 ]
评论
0赞
mescande
11/8/2023
谢谢,正如我所想知道的,所有未指定的元素都初始化为 0,如文档中所述
评论
array_index = (id < 0x20) ? (id - 0x10) : (id - 0x80)