一、看了一下H.264硬解代码,发现有类似这种方式的定义:
typedef void (*exec_ref_pic_marking_adaptive_mmco_func)(
GstVaapiDecoderH264 *decoder,
GstVaapiPictureH264 *picture,
GstH264RefPicMarking *ref_pic_marking
);
static const exec_ref_pic_marking_adaptive_mmco_func mmco_funcs[] = {
NULL,
exec_ref_pic_marking_adaptive_mmco_1,
exec_ref_pic_marking_adaptive_mmco_2,
exec_ref_pic_marking_adaptive_mmco_3,
exec_ref_pic_marking_adaptive_mmco_4,
exec_ref_pic_marking_adaptive_mmco_5,
exec_ref_pic_marking_adaptive_mmco_6,
};
这种方式的使用平时使用的可能不是很多,那么下面了解一下这种方式是如何运用的:
1首先该问题涉及到关于typedef void (*funcptr)(void)问题;
举例说明:
定义一个函数指针类型。
比如有以下三个函数:
void hello(void) { printf("你好!"); }
void bye(void) { printf("再见!"); }
void ok(void) { printf("好的!"); }
typdef void (*funcptr)(void);
这样就构造了一个通用的函数
你用的时候可以这样:
void speak(int id)
{
funcptr words[3] = {&hello, &bye, &ok};
funcptr fun = words[id];
(*fun)();
}
这样的话,如果speak(0)就会显示“你好!”
speak(1)就会显示“再见!”
speak(2)就会显示“好的!”,从这里便可以更好的理解开始的一段代码,首先定义一个指针,该指针指向含有三个参数(*decoder,*picture,*ref_pic_marking)的函数,并且有一个返回类型为void,前面加了一个typedef,说明exec_ref_pic_marking_adaptive_mmco_func就是这种类型的别名,因此使用该别名定义了一个数组,通过数组分别调用该类型的函数。
二、再举个简单的例子:
typedef int(*CallBack)(char *p);
指针变量名:CallBack
1.*CallBack:CallBack是一个指针
2.(*CallBack)():指向一个函数
3.(*CallBack)(char *p):这个函数有一个参数,类型为char*
4.int(*CallBack)(char *p):这个函数有一个返回值,类型为int
切记,后面的分号不可忘记哦~~
综述:CallBack是一个指针,指向具有一个char*类型参数,且返回一个int型数据的函数
前面有个typedef,所以现在CallBack是这种类型的别名。