您的位置:首页 > 运维架构 > Linux

OMAPL138学习---typedef int(init_fnc_t)(void)

2014-02-15 13:54 441 查看
在学习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循环调用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux OMAPL138 uboot