浅谈——void (*signal(int, void (*)(int)))(int) 函数声明

先说结论:这是一个返回类型是函数指针的函数声明,该函数的参数是一个int类型和一个函数指针

现在我们先抛开上面那个复杂的定义,先看一下下面的需求

  1. 定义一个函数;
  2. 该函数具有以下特点,两个参数,返回值是函数指针,并且一个参数也是函数指针。假如返回值和参数函数指针同为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,是不是就是我们文章开始提到的那个复杂声名?现在是不是明白了,原来如此啊,它是一个返回函数指针的的函数声名!

猜你喜欢

转载自blog.csdn.net/tonglin12138/article/details/93657393
今日推荐