2013-04-29 101 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

相關問題