简单理解函数声明(以signal函数为例)
2016-01-17 19:10
295 查看
这两天遇到一些声明比较复杂的函数,比如signal函数,那我们先简单说说signal函数的用法:(参考《c陷阱与缺陷》)
signal:几乎所有c语言程序的实现过程中都要用到signal函数,作为捕获不同步的一种方式。我们用户要调用signal函数,可以这样使用,首先在头文件中加入:
当然,我们今天的目的是函数声明,有关signal函数就到这里,这是“man signal”函数,我们可以看到它的声明:
看吧,是不是比较难理解,那让我们从hander(事件处理函数)入手,假设我们的事件处理函数是这样的
参数signum是一个信号值,我们可以先不管,那么我们的 hander 函数可以这样声明:
但是我们想用一个指向hander函数的指针来代替hander,就假设它为 point ,所以就有*point = hander;那么声明又可以写为:
因为signal函数返回值类型与point的类型一样(即hander的类型),那么signal函数我们就可以这样声明:
void (*signal(arg,hander))(int); 【注意:函数名是一个指向函数的指针,它就是函数入口】
在这里,我们将(arg,hander)传递给signal函数,signal函数经过处理,返回一个函数指针,指针指向的这个函数有一个参数为(int)类型,它的返回值为void 类型,这不就是我们的hander函数吗?对于signal中的arg不再作过多解释,我们将hander 函数“带入”,前面我们已经将hander函数声明为
我们也用typedef可以简化上面的声明:
经过这样一个过程,有没有对这个函数声明有些理解呢?
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);
经过这样一个过程,有没有对这个函数声明有些理解呢?
相关文章推荐
- 解析PageID的UDF
- [LeetCode] 219. Contains Duplicate II 解题思路
- Android应用:Lagrange
- 关于磁盘,磁柱,磁头,扇区等
- python--函数式编程--9
- Android循环添加多个控件
- IOS-线程(GCD)
- openstack之dashboard与cinder(二)
- DrictX 绘制线条
- 高颜值的她~美哭了
- 动态链接库DLL_第1篇
- 怎样将一张很长的大图平均分割成多张小图?
- Xcode7中自动布局AutoLayout和SizeClass的使用
- C++学习笔记29,引用变量(1)
- 计算机视觉的一些算法实现资源 Computer Vision Algorithm Implementations
- openstack之dashboard与cinder(一)
- 指针与数组,指针与函数,指针与字符串
- mongodb启动失败解决方案
- SGU 538. Emoticons 水题
- 在Dreamweaver中安装Emmet(zen-coding)