繁体   English   中英

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

[英]What is (void (**) ()) and how to typedef it?

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

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

我可以掌握使用函数指针c_int01设置中断向量这一c_int01 ,但我无法确定哪种类型的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;

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

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

你可以改写它:

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

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

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

你需要说:

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

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

这是有用的cdecl关于该表达式核心的说法(void (**) ())

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

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

Cdecl将是更快的了解方式:

     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;
   }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM