[英]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.