zoukankan      html  css  js  c++  java
  • C标准库函数中复杂的函数声明

    <signal.h> 中有一个复杂的函数声明。很叫人费解。

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

    我们按照向右看向左看的黄金法则来分析这个函数声明。如果你不明白我在讲什么,请看 读懂C复杂声明的黄金法则

    首先这个声明的主体是signal,这个应该没有争议。

    向右看,(int sig, void (*handler)(int)),括号和参数,说明signal是一个函数。
    第一个整形参数sig不用多讲,第二个参数比较复杂 void (*handler)(int),这是一个函数指针,它指向的函数接收一个整形参数,没有返回值。

    向左看,发现一个*,说明signal函数返回的是一个指针。
    向右看,向左看,是一对(),这怎么理解。(*)表明是一个函数指针,就是说signal函数的返回值是一个函数指针。

    再向右看,(int),说明signal返回的函数指针指向的函数接受一个整形参数。
    向左看,是void,说明signal返回的函数指针指向的函数没有返回值。

    综合来看,这个声明,是一个名叫signal的函数声明,其主体是 signal(int, void (*)(int)),其返回值是void (*)(int)

    分成这样写就清楚多了。

    typedef void (*callback)(int);
    callback signal(int sig, callback handler);
    

    signal函数的作用是为某个信号设置新的处理函数(指针),如果成功,将返回之前的处理函数(指针)。

    你可以将它返回的函数指针保存下来,方便以后重置该信号的处理函数。

    感谢SegmentFault上朋友的答疑。

  • 相关阅读:
    mac 使用brew 安装php-redis
    thinkphp6 使用redis 实现消息队列
    Redis 桌面管理器:Another Redis Desktop Manager
    linux 查看并关闭shell脚本执行
    MySQL教程之concat以及group_concat的用法
    PHP redis 使用
    thinkphp6 command(自定义指令)
    git 使用
    linux shell中 "2>&1"含义
    linux crontab 定时任务
  • 原文地址:https://www.cnblogs.com/jiqingwu/p/complex_signal_function.html
Copyright © 2011-2022 走看看