这组c演员是多么疯狂

con*_*sed 5 c casting

我正在看这个开源启动加载器,我看到了这行代码.最后一行发生了什么?是某种指向函数的指针,是否转换为地址?

    uint8_t ret = init_api();
    uint16_t ptr;
    ptr = PGM_READ_WORD(JUMP_TABLE_INDEX(6));

    ret = ( (uint8_t(*)(uint32_t, uint8_t *, uint8_t)) ptr )(addr, data, erase);
Run Code Online (Sandbox Code Playgroud)

Ale*_*exD 14

ptr 被转换为指向函数的指针

uint8_t f(uint32_t, uint8_t *, uint8_t)
Run Code Online (Sandbox Code Playgroud)

和函数被调用的参数addr,data,erase.

  • 另请注意,JUMP_TABLE_INDEX宏引用的跳转表很可能是函数指针数组,因此宏返回地址,上面代码的最后一行实际上调用跳转表的第6个元素引用的函数. (3认同)