OMAPL138學習---typedef int(init_fnc_t)(void)

在學習ICETEK-OMAP138板的uBoot,遇到

init_fnc_t **init_fnc_ptr

-------------------------------------------------------------------

init_fnc_t *init_sequence[] = {
 cpu_init, 
 board_init,
 interrupt_init,
 env_init, 
 init_baudrate, 
 serial_init, 
 console_init_f, 
 display_banner, 
 dram_init......

-------------------------------------------------------------------------------------------------------

for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
  if ((*init_fnc_ptr)() != 0) {
   hang ();

上面for循環就是在執行一個函數指針數組中的函數,函數指針數組是*init_sequence[];

在此之前定義了一個雙重指針:init_fnc_t **init_fnc_ptr

init_fnc_t 是函數類型的一個別名

init_fnc_t **init_fnc_ptr就是定義了一個init_fnc_t這樣類型函數的雙重指針。

init_sequence數組中的每個函數其實都是參數爲void,返回值爲int的函數,所以數組名init_sequence就也是參數爲void,返回值爲int類型函數的雙重指針。

在for語句中:init_fnc_ptr = init_sequence。*init_fnc_ptr是判斷函數指針是否存在。++init_fnc_ptr是指向數組的下一個元素,即指向下一個函數指針。

  for循環中的if語句:if ((*init_fnc_ptr)() != 0)就是用雙重函數指針調用數組中的這些函數。*init_fnc_ptr就是提取          init_fnc_ptr指向的內容,自然就是得到數組中的某個元素,即某個函數指針,然後使用函數指針直接調用這個函          數。如果函數返回爲非0,則調用hang(),停止執行

對於函數的申明:int initFunction()(void) 申明瞭一個函數名爲initFunction的函數

   typedef int(init_fnc_t)(void)

對於個int(void)類型的函數類型進行取別名init_fnc_t。

總結:當遇到需要執行一串子函數,可以先用typedef 進行函數類型的定義,然後申請定義後類型的函數指針數組,把要調用的函數名保存在這個數組中,申請一個init_fnc_t類型函數的雙重指針用於for循環調用。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章