在學習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循環調用。