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

时间:2013-04-29 10:37:25

标签: c function-pointers typedef interrupt

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

*((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 (**)())

//编辑:

对于那些被捕的人,我会更好地理解这一点:

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

5 个答案:

答案 0 :(得分:10)

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

因此,强制转换将整数0x01转换为类型为(void (*)())

的函数指针的地址

你可以改写它:

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

答案 1 :(得分:4)

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

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

你需要说:

*((interrupt_handler*) INTERRUPT_VECTOR) = (handler)

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

答案 2 :(得分:2)

以下是关于该表达式核心(void (**) ())

的有用cdecl所说的内容。
  

将unknown_name转换为指向函数返回void

的指针

所以,它是一个强制转换(由外部括号表示),类型是“指向函数指针”,这似乎是有道理的。

答案 3 :(得分:1)

Cdecl将是更快的了解方式:

     cast unknown_name into pointer to pointer to function returning void

着名的“螺旋式规则将是下一个:

          +-----+
          |+-+  |
          || |  V
   (void (** |)( ))
      ^   ^^||  |
      |   ||||  |
      |   ||+|  |
      |   +--+  |
      +---------+

按照您阅读的文字:

  • 指向
  • 的指针
  • 指向
  • 的指针
  • 一个返回的函数
  • 空隙

答案 4 :(得分:-1)

您可以将中断入口点向量的设置可视化为

   void (*interupt_handlers)()[256] = 0;

   void set_interupt_handler(int vector, void(*handler)())
   {
       interupt_handlers[vector] = handler;
   }