typedef声明自定义数据类型,配合各种原有数据类型来达到简化编程的目的。对于char (*(*x())[5])(); 我们可利用typedef来简化。
先定义:typedef char (*Fun)(); 那么:char (*(*x())[5])(); => Fun (*x())[5];再定义:typedef Fun A[5]; 那么:Fun (*x())[5]; => A *x(); 对于这种形式正是我们最熟悉的函数声明类型。
根据上面的简化模式,可逐步描述char (*(*x())[5])();的含义:
第一步:A *x();
声明x是一个输入参数为空且返回A的指针类型的函数。
第二步:Fun (*x())[5]; 声明x是一个输入参数为空且返回指向含有5个Fun类型数组的指针的函数。
第三步:char (*(*x())[5])(); 声明x是一个输入参数为空且返回指向含有5个指向函数指针且返回值为字符类型的数组指针的函数。
利用上述的方法,几乎可以理解任何复杂类型的声明,例如Linux系统调用函数signal的函数原型如下:
void (*signal(int signo,void (*func)(int))) (int);
对于该函数原型,给人的第一感觉就是复杂,不知从何下手。其实同样可以利用上面所讲的typedef声明来简化:先定义typedef void (*sighandler_t)(int); 那么void (*signal(int signo,void (*func)(int))) (int); => sighandler_t signal(int signo, sighandler_t handler);
对于sighandler_t signal(int signo, sighandler_t handler); 就和我们常见的函数声明非常类似了,唯一不同的是sighandler_t不是我们常见的基本数据类型,假如你不知道sighandler_t具体是什么类型,为了快速理解sighandler_t signal(int signo, sighandler_t handler);的含义,你可以把sighandler_t想象成为你最熟悉的int或char类型,对于int signal(int signo, int handler);你会很轻松的理解,对于sighandler_t signal(int signo, sighandler_t handler);你只需要了解sighandler_t的类型(即typedef void (*sighandler_t)(int);),就可以理解signal函数的完整原型声明。
转载于:https://blog.51cto.com/mikelee/372423