简单理解函数声明(以signal函数为例)

这两天遇到一些声明比较复杂的函数,比如signal函数,那我们先简单说说signal函数的用法:(参考《c陷阱与缺陷》)

signal:几乎所有c语言程序的实现过程中都要用到signal函数,作为捕获不同步的一种方式。我们用户要调用signal函数,可以这样使用,首先在头文件中加入:#include<signal.h> ,然后我们可以这样调用signal函数:signal(signal type,sighandler_t hander),这里的signal type代表系统头文件#include<signal.h>中某些常量,这些常量用来标识signal函数将要捕获的信号类型;sighander_t hander是当指定信号发生时,将要加以调用的事件处理函数。signal函数返回的是指向处理函数(即hander)的指针,也就是它返回“一个指向函数的指针”。

当然,我们今天的目的是函数声明,有关signal函数就到这里,这是“man signal”函数,我们可以看到它的声明:

#include <signal.h>

       typedef void (*sighandler_t)(int);

       sighandler_t signal(int signum, sighandler_t handler);

看吧,是不是比较难理解,那让我们从hander(事件处理函数)入手,假设我们的事件处理函数是这样的

void hander( int signum)
{
        /*特定的信号处理部分*/
}

参数signum是一个信号值,我们可以先不管,那么我们的 hander 函数可以这样声明:

void hander(int);

但是我们想用一个指向hander函数的指针来代替hander,就假设它为 point ,所以就有*point = hander;那么声明又可以写为:

void (*point)(int);

因为signal函数返回值类型与point的类型一样(即hander的类型),那么signal函数我们就可以这样声明:

void (*signal(arg,hander))(int); 【注意:函数名是一个指向函数的指针,它就是函数入口】

在这里,我们将(arg,hander)传递给signal函数,signal函数经过处理,返回一个函数指针,指针指向的这个函数有一个参数为(int)类型,它的返回值为void 类型,这不就是我们的hander函数吗?对于signal中的arg不再作过多解释,我们将hander 函数“带入”,前面我们已经将hander函数声明为 void (*point)(int), 这儿的point可以在声明时省略,也就是我们的signal函数可以这样声明了:

void  (*signal( int , void(*)(int)))(int);

我们也用typedef可以简化上面的声明:

typedef void (*sighander_t )(int) ;
sighander_t signal(int signum,sighander_t hander);

经过这样一个过程,有没有对这个函数声明有些理解呢?

你可能感兴趣的:(函数指针,函数声明,signal函数)