关于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是这种类型的别名。

时间: 2024-08-06 11:34:41

关于typedef void (*funcptr)(void)问题的相关文章

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,

typedef void (*funcptr)(void) typedef void (*PFV)(); typedef int32_t (*PFI)();

看到以下代码,不明白查了一下: /** Pointer to Function returning Void (any number of parameters) */ typedef void (*PFV)(); /** Pointer to Function returning int32_t (any number of parameters) */ typedef int32_t (*PFI)(); 定义一个函数指针类型.比如你有三个函数: void hello(void) { prin

typedef void (*funcptr)(void)的含义

fun a;//等价于void (*a)(); 这样声明起来就方便多了 void (*a)();表示a是个指针,指向一个不带参数.返回值为空的函数 定义一个函数指针类型. 比如你有三个函数: void hello(void) { printf("你好!"); } void bye(void) { printf("再见!"); } void ok(void) { printf("好的!"); } typdef void (*funcptr)(voi

typedef void(*Fun)(void);

函数类似于数组,函数名就是它的首地址: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 int i;             // 定义了一个int类型的变量i: 而这样 typedef INT int;   // 表示用户自己定义了一个整型数据类型INT,实际上就等同于int 所以:INT ii:                    // 表示定义了一个int类型的变量ii

typedef int (*ONMENU) (void) 的理解

typedef int (*ONMENU) (void) ——这就是一个取别名的过程. 通常情况下,我们会使用:typedef int  myint; myint a; 这里myint和int是一样的. 而对于函数的申明我们通常会这样申明:int Function() (void);此时表示申明了一个函数名为Function的函数, 函数没有任何的形参,返回值类型为int型. 而对于 typedef int(*NOMENU) (void);就是对一个 int (void)类型的函数类型进行取指针

typedef int(init_fnc_t) (void)的理解

typedef int(init_fnc_t) (void); 这个就是一个取别名的过程. 我们通常情况下会如下使用 typedef :typedef int MyInt;MyInt a; 这个时候我们的MyInt 就和int是一样的意思. 而对于函数的申明我们通常会这样申明:int InitFunction(void);此时表示申明了一个函数名为InitFunction的函数, 函数没有任何的形参,返回值类型为int型. 而对于 typedef int(init_fnc_t) (void);就

SGI STL 函数static void (* set_malloc_handler(void (*f)()))()与函数指针解析

在C++ STL的SGI实现版本中,一级空间配置器class __malloc_alloc_template中有一个静态函数的实现如下: static void (*set_malloc_handler(void (*f)()))() { void (*old)() = __malloc_alloc_oom_handler; __malloc_alloc_oom_handler = f; return (old); } 没接触过函数指针的人看到这段代码可能会很头疼,不知道这个函数表达什么意思.

void及void指针类型

1.概述 许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误.本文将对void关键字的深刻含义进行解说,并 详述void及void指针类型的使用方法与技巧. 2.void的含义 void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据. void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义: void a; 这行语句编译时会出错,提示“illegal use of ty

void和void*指针的一些理解

void 和 void* 指针分别表示无类型和无类型指针. void 的作用是限制: 1,函数无返回值. 2,函数无参数. 当函数的返还值无参数的时候一定要加上 void ,因为在缺省的状态下函数的返还值是 int ,并且如果不需要的时候就一定要将他声明成 void 类型这样看着更明显.当函数无参数的时候在声明的时候也要加上 void 的这也是一个好习惯,增强了可读性,当然在 K&R C 中是允许在声明的时候省去参数的. void 类型的和指针可以接受任何类型的类型的指针的赋值(但是不代表这个v