您的位置:首页 > 其它

使用typedef简化声明的实例分析

2010-10-15 00:55 309 查看
使用typedef简化复杂类型声明的过程首先需要从整体把握,搞清楚类型的结构(圆括号或方括号确定的层次关系),通常比较复杂的都是接受函数指针为参数并返回函数指针的函数,有时候一些参数名的出现可能会增加迷惑性,但只要抓住类型而忽略名称通常也都能快速分析出来,下面通过三个实例进行分析:



void ( *signal(int, void(*) (int) ) ) (int);

首先确定signal是一个函数名,接着分别从它的参数和返回值类型两个方面考虑:
signal函数有两个参数,第一个int型,第二个为void(*) (int)型,这种类型是函数指针,该指针指向的函数接受一个int参数并返回void型;
signal函数的返回值为指针,该指针指向一个函数,该函数接受一个int型参数并返回void型。在考虑函数返回值的类型时,可以将参数部分忽略,当作void ( *) (int)分析。
从前面两部分析中可以看出,signal函数第二个参数的类型与它的返回值类型是同一类型,都是void(*) (int)型,若将这种复杂类型记为NEW_TYPE的话,那么signal函数就可以写成NEW_TYPE signal(int, NEW_TYPE)。
于是,通过typedef void(*NEW_TYPE) (int),原来复杂的void ( *signal(int, void(*) (int) ) ) (int)就简化为了NEW_TYPE signal(int, NEW_TYPE)。



int ( * (*pf) ( double (*) (void) ) ) (void);

首先确定pf是一个函数指针(为了区别于其他函数指针,把这个函数指针暂且称为函数指针1),它指向的函数有一个参数,该参数的类型为double (*) (void),这种类型也是一个函数指针,这个函数指针指向的函数不接受参数同时返回double型;
函数指针1所指向函数的返回值是一个指针,类型是int ( * ) (void);,该指针指向一个函数,该函数不接受参数同时返回一个int型。
简单的说,就是函数指针1指向的函数接受一个参数TYPE_IN,并返回一个TYPE_OUT型,即:

TYPE_OUT (*pf)(TYPE_IN);
TYPE_IN实际上是一个函数指针,这个指针指向的函数不接受参数同时返回double型;
TYPE_OUT实际也是一个函数指针,它指向的函数不接受参数同时返回一个int型。
根据TYPE_IN的含义可以写出它对应的类型应该是double (*)(void);根据TYPE_OUT的含义写出其对应的类型是int (*)(void)。
因此,通过typedef double (*TYPE_IN)(void)、typedef int (*TYPE_OUT)(void)和TYPE_OUT (*NEW_PF)(TYPE_IN)这三句,就可以使用NEW_PF来作为新的类型名来替代上面那么复杂的类型进行新变量的声明和定义了。



int (*Register (int (*pf) (const char *, const char *) ) ) (const char *, const char *);

Register是一个函数,它的参数是int (*pf) (const char *, const char *) ,参数类型为int (*)(const char*, const char*),它的返回值类型是int (*)(const char*,const char*),参数类型与返回值类型相同,都是指向接受两个const char *作为参数,并返回int型的函数的指针。
详细点讲,Register是一个函数,它接受一个参数,这个参数是一个函数指针,该指针指向的函数接受两个const char*型的参数并返回int型;
Register返回一个指针,这个指针指向某种函数,该种函数接受两个const char*型变量并返回int型。
从上面看出,Register返回的指针指向的函数与作为Register参数的指针所指向的函数具有相同的原型,所以Register返回的指针和作为Register参数的指针是同一种类型的函数指针,它们的类型可以写为int (*)(const char*,const char*)。
若typedef int (*NEW_TYPE)(const char*, const char*),则上面复杂的一大串可以简化为:
NEW_TYPE Register(NEW_TYPE pf);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: