什么是(void(**)())以及如何键入它?

Gui*_*i13 4 c typedef function-pointers interrupt

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

*((void (**) ()) 0x01) = c_int01; /* Write the interrupt routine entry */
Run Code Online (Sandbox Code Playgroud)

我可以掌握使用函数指针设置中断向量这一事实c_int01,但我无法确定哪种类型的强制转换(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 );
Run Code Online (Sandbox Code Playgroud)

但嵌入式编译器抱怨LHS不是一个对象.

有谁知道这个符号表示什么? (void (**)())

//编辑:

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

*( (void (*)())* 0x01) = c_int01;
Run Code Online (Sandbox Code Playgroud)

Ste*_*sop 10

它是一个指向函数的指针.

因此,强制转换将整数转换为0x01具有类型的函数指针的地址(void (*)())

你可以改写它:

typedef void (*interrupt_handler)();
*((interrupt_handler*) 0x01) = c_int101;
Run Code Online (Sandbox Code Playgroud)


Ric*_*dle 6

(void (**) ())是一个指向函数指针的指针。

((void (*)())是指向函数的指针,因此添加星号会增加间接级别。)

你需要说:

*((interrupt_handler*) INTERRUPT_VECTOR) = (handler)
Run Code Online (Sandbox Code Playgroud)

其内容为:“将其视为INTERRUPT_VECTOR指向函数指针的指针,并将其值设置为handler”。