前天看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 <stdio.h> 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); }
我们还可以继续
就是一个函数指针A,它返回的是一个函数指针B,这个B函数是一个返回函数C值针的函数,而函数C就是一个返回函数D指针的函数。。。。。。
个人博客地址:http://www.flakor.cn