前天看APUE,看到signal的声明竟然是
void (*signal(int,void(*)(int)))(int);
初看下面,还真是看不出这是啥意思。道行太浅,仅仅能看到这样的函数指针 void *(*func)(int,void(*)(int)); 书中说先typedef下面就能看清楚这个指针 typedef void Signfunc(int); Signfunc *signal(int,Sigfunc *); 这样写的确变清晰了。但是搞不懂为啥应该是这么分析,为啥它不写成 (void (int))(*signal)(int,void(*)(int)); 这么写不是更能看懂,然后我放到gcc里面编译,它说 error: expected identifier or ‘(’ before ‘void’ (void (int))(*signal)(int,void(*)(int)); 改了一下。又说: error: expected identifier or ‘(’ before ‘int’ void (int)(*signal)(int x,void(*func)(int)) error: ‘signal’ declared as function returning a function void (*signal)(int,void(*)(int))(int); error: ‘signal’ declared as function returning a function void ((*signal)(int,void(*)(int)))(int); 看来它仅仅认这样的。真不知老美怎么想的,搞得这么难认。 看来仅仅能用这样的规则套了: 假设函数返回的不是函数指针。那么这个函数指针能够定义为例如以下形式: test的返回值 ( *test)(test的型參); 假设返回的是函数指针。我们要写成: 返回函数的返回值 (*test(test的參数))(返回函数的型參); 然后能够组合成各种恐怖的函数声明 void (*((*signal(int,void(*)(int)))(int,void(*)(int)))(int,void(*)(int)); 就是一个函数指针A。它返回的是一个函数指针B。这个B函数是一个返回函数C值针的函数。把复杂的參数先去掉,变成这样 void (*((*signal(int))(int))(int);#include我们还能够继续 就是一个函数指针A,它返回的是一个函数指针B,这个B函数是一个返回函数C值针的函数。而函数C就是一个返回函数D指针的函数。。void (*((*signal(int))(int)))(int);void (*fun(int))(int);void test(int);int main(int c, char ** v){ signal(323); return 0; }void (*((*signal(int x))(int)))(int){ printf("num:%d",x); return fun;}void (*fun(int y))(int){ return test; }void test(int x){ printf("fuck C function pointer!!!,%d",x);}
。。。。
个人博客地址: