typedef定义函数

例如: typedef int func(void); func等价于 int (void)类型函数
描述1: func f声明等价于 int f(void)声明,用于文件的函数声明
描述2: func *pf声明等价于 int (*pf)(void)声明,用于函数指针的生命,见下一条

6.函数指针
例如: typedef int (*func)(void)
描述: func等价于int (*)(void)类型
func pf等价于int (*pf)(void)声明,pf是一个函数指针变量

---------------------------

函数指针一般用于回调,例如信号处理,libcurl等会应用到回调。回调是比较常用的技术,而回调就要涉及函数指针。 当我们的程序中有以下函数:

void printHello(int i);

然后我们要定义一个函数指针,指向printHello,并且调用这个方法,代码如下:

void (*pFunc)(int); pFunc = &printHello; (*pFunc)(110);

其中void (*pFunc)(int)是声明一个函数指针,指向返回值是void,调用参数是(int)的函数,变量名是pFunc,pFunc就是函数指针了,以前是函数指针的简单用法。 大家可以看到,声明一个函数指针是比较复杂的,尤其是当你要在多处地方声明同一个类型的函数指针变量,代码更加复杂,所以有下面简化的做法:

typedef void (*PrintHelloHandle)(int);

使用代码如下:

PrintHelloHandle pFunc; pFunc = &printHello; (*pFunc)(110);

以后其他地方的程序需要声明类似的函数指针,只需要下面代码:

PrintHelloHandle pFuncOther

大家在看typedef和数组,指针以及typedef和函数,可能会觉得typedef比较复杂,但是其实typedef 行为有点像 #define 宏,用其实际类型替代同义字。 请看看下面例子

typedef char * pstr;  pstr mystr;

代码pstr mystr,展开之后就是char * mystr,把mystr,替换为语句typedef char * pstr的pstr,展开之后还是char * mystr。 typedef并不创建新的类型,typedef 在编译时被解释,因此让编译器来应付超越预处理器能力的文本替换而已。 这些规则可以应用到typedef和数组:

typedef char Line[81]; Line text;

把text替换为typedef char Line[81]的Line,展开之后就是

char text[81]; 

也可以应用到最复杂的typedef和指针

typedef void (*PrintHelloHandle)(int); PrintHelloHandle pFunc;

将pFunc替换typedef void (*PrintHelloHandle)(int),展开之后就是

void (*pFunc)(int);

其实就是声明一个pFunc函数指针而已,根本没有PrintHelloHandle这种类型。

posted @ 2018-09-07 14:49  ofsource  阅读(516)  评论(0)    收藏  举报