关于typedef void (*funcptr)(void)问题

一、看了一下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是这种类型的别名。






你可能感兴趣的:(指针数组,C函数指针)