C/C++函数指针声明

前天看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

posted on 2016-01-19 18:50  gcczhongduan  阅读(495)  评论(0编辑  收藏  举报