我使用的是函数指针数组,并且我想将其直接与其关联的事件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标准.

C++相关问答推荐

Zig将std.os.argv转换为C类型argv

segfault在C中使用getline()函数

Ebpf内核代码:permission denied:invalid access to map value

如果我释放其他内容,返回值就会出错

轮询libusb_pollfd struct 列表的正确方式是什么?

S的这种管道实施有什么问题吗?

如何在提取的索引中分配空值?

C语言中的外部关键字

C将数组传递给函数以修改数组

将回调/基于事件的C API转换为非回调API

运行时错误:在索引数组时加载类型为';char';`的空指针

为什么GCC-O1优化破解了这个代码,为了一个GameBoy高级只读存储器而修改了VRAM的循环?

对于STM32微控制器,全局偏移表.get和.Got.plt必须为零初始化

int * 指向int的哪个字节?

使用C++中的字符串初始化 struct 时,从‘char*’初始化‘char’使指针变为整数,而不进行强制转换

隐藏测试用例无法在c程序中计算位数.

当用C打印过多的';\n';时输出不正确

分配给静态变量和动态变量的位置之间有区别吗?

在 C 中的 scanf() 格式说明符中使用宏获取字符串长度

为什么使用 C 引用这个 char 数组会导致 Stack smasing?