近期看mplayer的代码,跟踪一个变量的使用的时候,突然发现是取得一函数的返回值而引起变化,立即去查找这个函数的具体实现代码,结果grep整个代码树也没有找到该函数的具体实现代码,只好静下心一步一步看代码是怎么走的:
typedef struct demuxers_desc_st {
...
int (*check_file)(struct demuxer_st *demuxer);//假设这里的下标是10
...
} demuxer_desc_t;
demuxer_desc_t* demuxer_list[] = {
...
&demuxer_desc_rawaudio,
&demuxer_desc_rawvideo,
&demuxer_desc_tv,
&demuxer_desc_mpeg_ps,
NULL
};
demuxer_desc_t demuxer_desc_mpeg_ps = {
...
demux_mpg_probe,
...
};
static demuxer_desc_t* get_demuxer_desc_from_type(int file_format)
{
...
return demuxer_list[i];
}
demuxer_desc_t *demuxer_desc;
demuxer_desc = get_demuxer_desc_from_type(file_format));
fformat = demuxer_desc->check_file(demuxer);
这里的check_file()就是我前面提到的找不到具体实现的函数,首先知道我们它是一函数指针,现在来分析它最后到底指向谁:
1) check_file()是结构体demuxer_desc的一个成员函数,在上面的代码里我们假设其下标是10;
2) 结构体demuxer_desc是通过调用函数get_demuxer_desc_from_type()来填充的,而get_demuxer_desc_from_type()的返回值是demuxer_list[i],这里的具体值是&demuxer_desc_mpeg_ps,所以demuxer_desc的成员函数也就是demuxer_desc_mpeg_ps的成员函数,进而知道demuxer_desc的第10个成员和demuxer_desc_mpeg_ps的第10个成员应该是一一对应的,而demuxer_desc_mpeg_ps的第10个成员是demux_mpg_probe,所以check_file最后指向的就是demux_mpg_probe,就这样明目张胆地被偷天换日了:(
阅读(1572) | 评论(0) | 转发(0) |