C 什么是(void(**)())以及如何键入定义?
在我必须理解的嵌入式代码中,有这样一行代码:C 什么是(void(**)())以及如何键入定义?,c,function-pointers,typedef,interrupt,C,Function Pointers,Typedef,Interrupt,在我必须理解的嵌入式代码中,有这样一行代码: *((void (**) ()) 0x01) = c_int01; /* Write the interrupt routine entry */ 我可以理解这样一个事实,即您使用函数指针c_int01设置中断向量,但我不知道(void(**)()指的是哪种类型的强制转换。我知道标准函数指针表示法(void(*)()),但不知道另一种 我尝试重构代码,使其看起来更具可读性,如下所示: // header typedef void (*interru
*((void (**) ()) 0x01) = c_int01; /* Write the interrupt routine entry */
我可以理解这样一个事实,即您使用函数指针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 );
但是嵌入式编译器抱怨LHS不是一个对象
有人知道这个符号是什么意思吗<代码>(无效(**)())
//编辑:
对于那些被询问的人,我会更好地理解这一点:
*( (void (*)())* 0x01) = c_int01;
它是指向函数指针的指针 因此,强制转换将整数
0x01
转换为类型为(void(*)()
你可以重写它:
typedef void (*interrupt_handler)();
*((interrupt_handler*) 0x01) = c_int101;
(void(**)())
是指向函数指针的指针
((void(*)()
是指向函数的指针,因此添加星号会增加间接级别。)
你需要说:
*((interrupt_handler*) INTERRUPT_VECTOR) = (handler)
上面写着,“将
中断向量
视为指向函数指针的指针,并将其值设置为handler
”下面是关于该表达式的核心(void(**)())
的有用说法:
将未知_名称强制转换为指向返回void函数的指针的指针
因此,它是一个强制转换(由外圆括号表示),类型是“指向函数指针的指针”,这似乎是有意义的。将是了解以下内容的更快方法:
cast unknown_name into pointer to pointer to function returning void
著名的“螺旋法则”将是下一条:
+-----+
|+-+ |
|| | V
(void (** |)( ))
^ ^^|| |
| |||| |
| ||+| |
| +--+ |
+---------+
以下是您阅读的内容:
- 指向
- 指向
- 返回函数
- 空虚
void (*interupt_handlers)()[256] = 0;
void set_interupt_handler(int vector, void(*handler)())
{
interupt_handlers[vector] = handler;
}
它是指向函数指针的指针。Maaannn,我怎么没看到…我明白了。除非你的平台有
sizeof(void(*)()==1
或者向量表从奇数地址开始,0x01
不可能正确。我确认,sizeof(char)==sizeof(int)==1==32位,在我的平台上(嵌入式DSP)。明白了,史蒂夫是第一个回答的人,所以我会得到他的答案。你的回答我的一票。你必须告诉我更多关于你的螺旋法则!@xgbi:不要太担心我多年前从一本杂志上学到的东西(电脑杂志适合那些年龄大到能记住它的人)它也在comp.lang.c常见问题解答中:这更具可读性。**
似乎有些过分,而(void(*)()*)*
则更为清晰。