typdef的高级用法
本人摘自《C语言与程序设计大学教程》一书8.11节,觉得对已入门者有用,因此,摘录下来。前面阐述了使用typedef的两个原因。使用typedef的原因之三为:为复杂的声明定义一个新的简单的别名。本书把typedef的这一用法称为“高级”用法,并不是因为它有多么高深,而是因为相对难以理解一些而已。要掌握typdef的这一用法,需要读者理解各式各样的复合声明符。比如:int *(*a[5])(int, char*); 声明的是什么?
int *(*a[5])(int, char*);声明的是一个函数指针数组(名为a、数组元素个数为5),其中每个元素是一个函数指针,每一个函数指针指向的是返回值为int *类型、形参分别为int和char *的函数。显然,如果能将a[5]的声明说明符进行简化,则很容易声明数组a[5]:简化后的类型 a[5];。
那么,对声明int *(*a[5])(int, char*);,如何取新的简单的别名呢?答案是:
typdef int *(*pFun)(int, char *);
int *(*pFun)(int, char *)声明了一个名为pFun的函数指针。上述语句的意思是:将int *(*pFun)(int, char *)中声明的函数指针pFun作为一个新的类型。
此后,pFun a[5];则与int *(*a[5])(int, char*);的作用一致。pFun a[5];声明了一个名为a,元数个数为5的数组,数组中每一个元素为pFun类型。pFun类型代表的是一个函数指针,它指向的返回值类型为int *,两个形式参数分别为int、char*类型。
例8-27 使用typedef简化声明void (*b[10]) (void (*)());。
解:void (*b[10]) (void (*)());声明的是一个函数指针数组(名为b、数组元素个数为10),其中每个元素是一个函数指针,每一个函数指针指向的返回值类型为void *,形式参数为函数指针void (*)()的函数。同理,如果能将b[10]的声明说明符进行简化,则很容易声明数组b[10],其简化声明形式为:简化后的类型 b[10];。
简化分为两步:
第一步:对void ((*)())进行简化。具体为:typedef void((*fpPara)());,此后,void (*b[10]) (void (*)());就可以变为:void (*b[10]) (fpPara);。
第二步:void (*b[10]) (fpPara)进行简化,具体为:typedef void (*fp)(fpPara);
从而,原声明的简化版本为:fp b[10];。
例8-28 使用typedef简化声明doube(*)() (*e)[10];。
解:doube(*)() (*e)[10]声明的是名为e的指针数组,数组元素为10个。数组中每个元素的类型为double(*)()。
为对原声明进行简化,需要对double (*)()进行简介,具体为:typedef double(*fp)(),此后, doube(*)() (*e)[10];就可以变为:fp (*e)[10];。当然,fp (*e)[10];还可以进一步简化,请读者自行处理。
从上面的分析不难看出, 只要能读懂原声明的含义,就不难用typedef对它进行简化。