首页 > 代码库 > C/C++函数指针声明

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

C/C++函数指针声明