2013-04-29 135 views
4

在嵌入式代码中,我已经明白,还有这行代码:什么是(void(**)())以及如何typedef它?

*((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嵌入式编译哼唧不beeing的对象。

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

//编辑:

对于那些interrested,我会明白这更好:

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

它的指针的函数。 – WhozCraig 2013-04-29 10:39:06

+0

MAAAANNN,我怎么没有看到...我明白了。 – Gui13 2013-04-29 10:40:59

+0

除非你的平台具有'sizeof(void(*)())== 1'或向量表开始于一个奇数地址,否则'0x01'不可能是正确的。 – 2013-04-29 17:18:36

回答

10

这是一个指针到指针到函数。

所以投整数0x01转换为具有函数指针类型(void (*)())

的你可以把它改写地址:

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

这样更可读。 '**'看起来过分夸张,而'(void(*)())*'更清晰。 – Gui13 2013-04-29 12:12:11

4

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

(void (*)())是指向一个功能,因此添加一个明星添加了一个间接的水平。)

你需要说:

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

,上面写着“对待INTERRUPT_VECTOR为指针到函数指针,并将其值设置为handler。“

+0

Gotcha,史蒂夫是第一个回答,所以我会得到他的答案。你的赞成。 – Gui13 2013-04-29 10:41:37

2

这里就是不断有用cdecl说,关于表达的核心,(void (**)())

投unknown_name为指针函数指针返回void

所以,这是一个投(如由外部括号所表示的那样),并且类型是“指向函数的指针的指针”,这似乎是有意义的。

1

Cdecl会知道的更快捷的方法:

 cast unknown_name into pointer to pointer to function returning void 

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

  • 一个:

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

    随着你读线指向

  • 指向
  • 函数返回
  • 无效
+0

你必须告诉我更多关于你的螺旋规则! – Gui13 2013-04-29 10:51:10

+1

@xgbi:不要太担心[螺旋法则](http://stackoverflow.com/questions/16260417/the-spiral-rule-about-declarations-when-is-it-in-error) – 2013-04-29 11:00:13

+0

我从很多年前就从一本杂志(计算机杂志为那些能够记得它的人)学习了它,它也在comp.lang.c常见问题中:http://c-faq.com/decl/spiral.anderson。 html – 2013-04-29 11:40:22

-1

您可以将指针形象化中断入口点向量的设置为

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

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

-1 [这是一个无效声明](http://ideone.com/Qpr9CK)。 – 2013-04-29 17:16:29

相关问题