这两天遇到一些声明比较复杂的函数,比如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”函数,我们可以看到它的声明:

点击(此处)折叠或打开

  1. #include <signal.h>
  2. typedef void (*sighandler_t)(int);
  3. 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函数为例)的更多相关文章

  1. 简单理解ECMAScript2015中的箭头函数新特性

    箭头函数(Arrow functions),是ECMAScript2015中新加的特性,它的产生,主要有以下两个原因:一是使得函数表达式(匿名函数)有更简洁的语法,二是它拥有词法作用域的this值,也 ...

  2. JavaScript 中对变量和函数声明提前的演示样例

    如题所看到的,看以下的演示样例(能够使用Chrome浏览器,然后F12/或者右键,审查元素.调出开发人员工具,进入控制台console输入)(使用技巧: 控制台输入时Shift+Enter能够中途代码 ...

  3. 如何理解signal函数声明

    Signal函数用起来其实很简单,但是回头看看他的声明,相信会有很多人表示费解.自己也在这个问题中纠结了好几年了,今天终于弄明白,很是兴奋,一起分享一下. 先看函数原型:void (*signal(i ...

  4. 深入理解,函数声明、函数表达式、匿名函数、立即执行函数、window.onload的区别.

    一.函数声明.函数表达式.匿名函数1.函数声明:function fnName () {…};使用function关键字声明一个函数,再指定一个函数名,叫函数声明. 2.函数表达式 var fnNam ...

  5. 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 ...

  6. 【VS开发】程序如何捕捉signal函数参数中指定的信号

    当说到signal的功能时,我们都知道它会捕捉我们所指定的信号,然后调用我们所指定的信号处理函数.但它是如何捕捉我们指定的信号的呢?下面我就以msdn上关于signal的example为例,说明sig ...

  7. js函数表达式和函数声明的区别

    我们已经知道,在任意代码片段外部添加包装函数,可以将内部的变量和函数定义"隐 藏"起来,外部作用域无法访问包装函数内部的任何内容. 例如: var a = 2; function ...

  8. javascript中函数声明和函数表达式浅析

    记得在面试腾讯实习生的时候,面试官问了我这样一道问题. //下述两种声明方式有什么不同 function foo(){}; var bar = function foo(){}; 当初只知道两种声明方 ...

  9. 信号之signal函数

    UNIX系统的信号机制最简单的接口是signal函数.signal函数的功能:为指定的信号安装一个新的信号处理函数. #include <signal.h> void (*signal(i ...

随机推荐

  1. SonarQube安装Java扫描插件

    近段时间在研究sonarqube,成功扫描python项目,但是扫描java项目失败. 在网上查询到,扫描java项目需要安装Java插件. 如下图: 而我在最新的sonarqube中搜索java,没 ...

  2. mac使用brew update无反应,更新慢解决办法

    一.原因 主要是资源访问太慢的原因造成的,替换一下镜像就可以了 有点耐心,大概5分钟就可以了,刚开始的时候terminal 只有顶部的title栏会变化,最后才会出现更新结果 使用中科大的镜像 替换默 ...

  3. kendoUI 多选下拉列表 kendoMultiSelect

    问题1:被重复渲染 点击新增按钮----弹出模态框 多选下拉列表在多选框中只是初始化过一次.但是每次点击新增后  发现 多选下拉列表 被重复渲染了 解决方案 在 新增时  先将其父元素div中  的s ...

  4. Bootstrap的模态框无法弹出的问题

    今天在使用Bootstrap官网所提供的模态框插件时候发现其中的 可选尺寸模态框 无法弹出 在模态框前使用过其他 Bootstrap的js插件,可以正常使用,说明所需依赖js文件已经正常引用 注意:j ...

  5. Java 使用 Socket 实现客户端和服务器的信息交互

    服务器 public class Server{ private ServerSocket serverSocket; private Socket socket; private BufferedR ...

  6. iptables配置操作

    1.防火墙添加配置规则(正向) vim /etc/sysconfig/iptables 指定服务器的ip访问内访问某个端口 -A INPUT -p tcp -m iprange --src-range ...

  7. mysql group by语句流程是怎么样的

    group by流程是怎么样的 注意点: select id%10 as m, count(*) as c from t1 group by m; group by是用于对数据进行分组,我们排序用到了 ...

  8. 内网渗透DC-3靶场通关

    个人博客:点我 DC系列共9个靶场,本次来试玩一下DC-3,只有1个flag,下载地址. 下载下来后是 .ova 格式,建议使用vitualbox进行搭建,vmware可能存在兼容性问题.靶场推荐使用 ...

  9. Just My Code debugging

    Just My Code debugging During a debugging session, the Modules window shows which code modules the d ...

  10. K12教培从业者转型指南 换个赛道依然可以再创辉煌

    随着"双减"政策的落地,属于K12教培机构的时代逐渐拉上帷幕,面对机会不再的K12教培行业,约70万机构和近千万的从业人员面临转型问题.压力之下,留下或离开?对广大K12教培机构从 ...