c - 什么是 (void (**) ()) 以及如何对它进行类型定义?

标签 c function-pointers typedef interrupt

在我必须理解的嵌入式代码中,有这行代码:

*((void (**) ()) 0x01) = c_int01; /* Write the interrupt routine entry */

我能理解你用函数指针 c_int01 设置了中断 vector ,但我不知道是哪种类型的转换 (void (**) ()) 指的是。我知道标准函数指针表示法 (void (*)()) 但不知道另一个。

我尝试重构代码,使其看起来更具可读性,如下所示:

// header
typedef void (*interrupt_handler)(); // prototype of an interruption handler
#define INTERRUPT_VECTOR 0x01
#define SET_INTERRUPT_HANDLER( handler ) *((interrupt_handler) INTERRUPT_VECTOR) = (handler)

// code
SET_INTERRUPT_HANDLER( c_int01 );

但是嵌入式编译器提示 LHS 不是一个对象。

有人知道这个符号是什么意思吗? (无效(**)())

//编辑:

对于那些感兴趣的人,我会更好地理解这一点:

*( (void (*)())* 0x01) = c_int01;

最佳答案

这是一个指向函数指针的指针。

所以转换将整数 0x01 转换为类型为 (void (*)()) 的函数指针的地址

你可以重写它:

typedef void (*interrupt_handler)();
*((interrupt_handler*) 0x01) = c_int101;

关于c - 什么是 (void (**) ()) 以及如何对它进行类型定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16276540/

相关文章:

c - 在一个应用程序中注册回调以在另一个应用程序中检索

c - GBDK C 中 typedef 结构的前向声明

c++ - 类型定义和转换

c# - 在 C# 中使用继承而不是名称别名是否正确?

c - 如果使用实数,C 如何处理复杂的方程式

c - 如何在不使用循环的情况下在 C 中初始化 N 维数组

c - 如何从共享内存中分离字符串数组? C

c - 指向 char 的指针数组的指针与指向 char 的指针的指针(或 char** argv 与 char* (*argv)[])

c++ - Constexpr 函数指针作为模板参数 MSVC vs GCC

c - 函数内的自由字符指针