先说结论:这是一个返回类型是函数指针的函数声明,该函数的参数是一个int类型和一个函数指针。
现在我们先抛开上面那个复杂的定义,先看一下下面的需求
- 定义一个函数;
- 该函数具有以下特点,两个参数,返回值是函数指针,并且一个参数也是函数指针。假如返回值和参数函数指针同为void (*)(int); 另一个函数参数是int型。该函数定义名称为my_func。
根据需求我们可以很容易定义出这种函数:
typedef void (*HANDLER)(int); // 参数函数和返回函数定义
HANDLER my_func(int, HANDLER);
突然需求中又不让使用typedef,这就是早期C语言不支持typedef的情况,那么如何定义这种函数呢?我们假如说my_func的返回值是int,是不是它的定义可以这么写:
int my_func(int, void (*)(int));
也就是说,my_func(int, void (*)(int))就是一个int型数据。现在将int换成一个函数,也就是
void (*)(int) my_func(int, void (*)(int);
这样一种定义,显然这种语法不支持,那么,实际是如何表示呢?回过头来,我们先看看函数指针的声明格式
void (*pfunc)(int);
其中pfunc 等价于 void ()(int)。现在在看看上面的格式,是不是很相识,对了,pfunc就是my_func(int, void ()(int))。现在如果将两者代替一下是不是就成了这种格式:
void (*my_func(int, void(*)(int)))(int)
如果将my_func换成signal,是不是就是我们文章开始提到的那个复杂声名?现在是不是明白了,原来如此啊,它是一个返回函数指针的的函数声名!