简单理解函数声明(以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);
经过这样一个过程,有没有对这个函数声明有些理解呢?
阅读(2) | 评论(0) | 转发(0) |
版权声明:本文为博主原创文章,未经博主允许不得转载。
简单理解函数声明(以signal函数为例)的更多相关文章
- 简单理解ECMAScript2015中的箭头函数新特性
箭头函数(Arrow functions),是ECMAScript2015中新加的特性,它的产生,主要有以下两个原因:一是使得函数表达式(匿名函数)有更简洁的语法,二是它拥有词法作用域的this值,也 ...
- JavaScript 中对变量和函数声明提前的演示样例
如题所看到的,看以下的演示样例(能够使用Chrome浏览器,然后F12/或者右键,审查元素.调出开发人员工具,进入控制台console输入)(使用技巧: 控制台输入时Shift+Enter能够中途代码 ...
- 如何理解signal函数声明
Signal函数用起来其实很简单,但是回头看看他的声明,相信会有很多人表示费解.自己也在这个问题中纠结了好几年了,今天终于弄明白,很是兴奋,一起分享一下. 先看函数原型:void (*signal(i ...
- 深入理解,函数声明、函数表达式、匿名函数、立即执行函数、window.onload的区别.
一.函数声明.函数表达式.匿名函数1.函数声明:function fnName () {…};使用function关键字声明一个函数,再指定一个函数名,叫函数声明. 2.函数表达式 var fnNam ...
- signal函数的原型声明void (*signal(int signo, void (*fun(int))))(int)分析
转:http://blog.sina.com.cn/s/blog_4850a7880100hnam.html void (*signal(int signo, void (*fun(int))))(i ...
- 【VS开发】程序如何捕捉signal函数参数中指定的信号
当说到signal的功能时,我们都知道它会捕捉我们所指定的信号,然后调用我们所指定的信号处理函数.但它是如何捕捉我们指定的信号的呢?下面我就以msdn上关于signal的example为例,说明sig ...
- js函数表达式和函数声明的区别
我们已经知道,在任意代码片段外部添加包装函数,可以将内部的变量和函数定义"隐 藏"起来,外部作用域无法访问包装函数内部的任何内容. 例如: var a = 2; function ...
- javascript中函数声明和函数表达式浅析
记得在面试腾讯实习生的时候,面试官问了我这样一道问题. //下述两种声明方式有什么不同 function foo(){}; var bar = function foo(){}; 当初只知道两种声明方 ...
- 信号之signal函数
UNIX系统的信号机制最简单的接口是signal函数.signal函数的功能:为指定的信号安装一个新的信号处理函数. #include <signal.h> void (*signal(i ...
随机推荐
- java基础面试题(一)
1.java中的数据类型,各占多少个字节? 2.面向对象的特性 1-封装:简单来说,封装就是把数据和操作数据的方法绑定起来,如果需要访问,可以使用已定义的接口进行访问 2-继承:从已有的类得到继承信息 ...
- WPF进阶技巧和实战03-控件(5-列表、树、网格01)
列表控件 ItemsControl为列表项控件定义了基本功能,下图是ItemsControl的继承关系: 在继承自ItemsControl类的层次结构中,还显示了项封装器(MenuItem.TreeV ...
- Spring,AOP实现功能级别权限验证
1. 首先是问题出现的原因 对于一个我的一个个人博客网站,我希望游客可以浏览我的博客,但是评论功能是需要登录才能使用 这就需要对某个功能进行权限验证 对于过滤器,拦截器,AOP的区别日后再讨论,现在是 ...
- Notepad++离线安装使用Markdown插件
1.介绍 MarkdownViewerPlusPlus是Notepad++的Markdown插件, 这个Markdown插件可以在Notepad++中实时动态渲染, 可以同步查看使用Markdown的 ...
- 踩坑系列《二》NewProxyResultSet.isClosed()Z is abstract 报错踩坑
在运行测试类的时候莫名其妙的报了个 NewProxyResultSet.isClosed()Z is abstract 这个错误,之前出现过这个错误,以为是版本出现了问题 就将版本 0.9.1.2 改 ...
- Java秘诀!Java赋值运算符介绍
运算符丰富是 Java 语言的主要特点之一,它提供的运算符数量之多,在高级语言中是少见的. Java 语言中的运算符除了具有优先级之外,还有结合性的特点.当一个表达式中出现多种运算符时,执行的先后顺序 ...
- [AGC023D] Go Home 题解
题目传送门 Solution 首先排除掉特殊情况:若 \(S\) 在两侧,肯定会顺序/逆序直接走完,答案就是边界减去出发点. 考虑到若 \(P_1\geq P_n\),那么显然 \(1\) 不到家 \ ...
- AutoCAD云产品平台ForgeViewer格式离线部署思路分析
背景 在上一篇博文中CAD图DWG解析WebGIS可视化技术分析总结提到,利用AutoCAD的自有云产品 Autodesk Forge,能在浏览器中渲染 3D 和 2D 模型数据,实现DWG图形的We ...
- FastAPI 学习之路(十七)上传文件
系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...
- perl 不支持多条件比较
perl 不支持多条件比较,if(a < $var < b),这个条件表达式在C语言里面是支持的,但是在Perl中必须写成if(($var > a)&&($var & ...