您的位置:首页 > 其它

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

2016-01-17 19:10 295 查看
这两天遇到一些声明比较复杂的函数,比如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);


经过这样一个过程,有没有对这个函数声明有些理解呢?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: