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(*)()*)*
则更为清晰。