1. 程式人生 > >關於typedef int (init_fnc_t) (void);理解

關於typedef int (init_fnc_t) (void);理解

來源:http://blog.chinaunix.net/uid-22979746-id-2590215.html

位於lib_arm/board.c

typedef int (init_fnc_t) (void);    //自定義新的資料型別init_fnc_t,這個資料型別是引數為空,返回值為int的函式

PS:注意init_fnc_t並不是函式指標!!! 如果這樣寫就表示函式指標 typedef int (*init_fnc_t) (void);

//init_sequence是一個指標陣列(陣列元素為指標變數),指向的是init_fnc_t型別的函式(為什麼是函式呢?因為指向的新的資料型別init_fnc_t是引數為空,返回值為int的函式)


init_fnc_t *init_sequence[] = {        //int *init_sequence[i]表示指標陣列,也就是陣列元素是指標變數(函式的入口地址)!!!
#if defined(CONFIG_ARCH_CPU_INIT)
    arch_cpu_init,        /* basic arch cpu dependent setup 基本的處理器相關配置 -- cpu/s3c44b0/cpu.c */
#endif
    board_init,        /* basic board dependent setup 基本的板級相關配置 -- board/samsung/smdk2410/smdk2410.c */

#if defined(CONFIG_USE_IRQ)
    interrupt_init,        /* set up exceptions 初始化例外處理 -- cpu/s3c44b0/interrupt.c */
#endif
    timer_init,        /* initialize timer */
    env_init,        /* initialize environment 初始化環境變數 -- common/env_flash.c  */

    init_baudrate,        /* initialze baudrate settings 初始化波特率設定 -- lib_arm/board.c*/
    serial_init,        /* serial communications setup 串列埠通訊設定 -- cpu/s3c44b0/serial.c */
    console_init_f,        /* stage 1 init of console 控制檯初始化階段1 -- common/console.c*/
    display_banner,        /* say that we are here 列印u-boot資訊 -- lib_arm/board.c*/
#if defined(CONFIG_DISPLAY_CPUINFO)
    print_cpuinfo,        /* display cpu info (and speed) */
#endif
#if defined(CONFIG_DISPLAY_BOARDINFO)
    checkboard,        /* display board info */
#endif
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
    init_func_i2c,
#endif
    dram_init,        /* configure available RAM banks 配置可用的RAM -- board/samsung/smdk2410/smdk2410.c*/
#if defined(CONFIG_CMD_PCI) || defined (CONFIG_PCI)
    arm_pci_init,
#endif
    display_dram_config,        //顯示RAM的配置大小 -- lib_arm/board.c
    NULL,
};

 //init_fnc_t 為指向函式指標的指標
    init_fnc_t **init_fnc_ptr;    //init_fnc_ptr是函式指標的指標,"函式指標"表示指向的內容;後面的"指標"表示init_fnc_ptr本身為一個指標變數

    /*init_fnc_ptr初始化指向init_sequence指標陣列,下 面的迴圈遇到NULL結束*/
    for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {  
        if ((*init_fnc_ptr)() != 0) {    /*(*init_fnc_ptr)()為C中呼叫指標指向的函式,例如 arch_cpu_init()*/
            hang ();        //列印錯誤資訊並死鎖
        }
    }

PS:指標陣列和指向指標的指標 兩者的主要區別(現在只悟到了這麼一點)

就是,指標陣列的陣列名不能進行++操作(因為陣列名僅僅代表一個地址!是一個常量!!),而指向指標的指標是可以++的(因為它是一個變數!),所以這段原始碼中,重新定義了一個指向函式指標的指標init_fnc_ptr來對指標陣列(init_sequence)進行操作. 操作也就是將各個準備初始化的函式的入口地址依次賦給init_fnc_ptr!而*init_fnc_ptr就正好對應arch_cpu_init這些東西了,那麼(*init_fnc_ptr)()就相當於arch_cpu_init()了.

PS:函式指標就是函式的入口地址,指標就是地址,貌似可以這麼來理解