簡體   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