学习到u-boot的第二阶段,在borad.c文件中看到这个类型定义。有些迷惑,C语言功底本来就一般,再加上学习前面的东西被ARM的汇编代码已经搞的头脑乱七八糟了,就没法分析清楚这个东东的真正含义了,不过咱们有强大的网络支持,谷歌和度娘查一炮,啥都清楚了。
首先,typedef int (init_fnc_t) (void)本质就是个类型定义,定义的就是一个新的数据类型init_fnc_t,
这个数据类型是参数为空,返回值为int的函数。即我们typedef int (init_fnc_t) (void)类型就是定义了一种数据类型,这种类型是一种函数,这种函数是一种参数为空,返回值为int的函数。
那下面的程序就不难理解了:
/*init_sequence是一个指针数组,指向的是init_fnc_t类型的函数*/
init_fnc_t *init_sequence[] = {
#if defined(CONFIG_VCMA9) || defined (CONFIG_CMC_PU2)
#endif
};
/*init_fnc_ptr为指向函数指针的指针*/
init_fnc_t **init_fnc_ptr;
/*init_fnc_ptr初始化指向init_sequence指针数组,下面的循环遇到NULL结束*/
for (init_fnc_ptr= init_sequence;*init_fnc_ptr; ++init_fnc_ptr){
}
C语言调用函数指针的方式:
有两种:
void test(int);
main(){
void (*fp)(int);
fp=test;
(*fp)(9);
fp(9);
return 0;
}
void test(int a)
{
printf( "%d\n", a );
}
这两种形式是等价的,都是为ANSI C所接受的。
自然,我们上面的例子是使用了第二种。首先要明白,我们的定义init_fnc_t **init_fnc_ptr;是定一个指针init_fnc_ptr,该指针指向的内容还是一个指针1,而指针1的类型是init_fnc_t类型的指针,即指针1指向一个init_fnc_t类型的数据,这个数据其实是我们定义的一种参数为空,返回值为int的函数。那后面我们使用*init_fnc_ptr是取出了init_fnc_ptr指针所指向的内容,自然这个内容就是指针1,在for循环中,这个指针1就会分别是数组中的每个值,即函数指针,那么for循环语句口号中的
至此,将这个问题搞明白了!