C语言高手帮忙分析一下复杂的函数声明-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

C语言高手帮忙分析一下复杂的函数声明

2016-06-07 20:10:02 2113 7

C语言高手帮忙分析一下下面这个复杂的声明,最好有详细步骤:

void (signal(int sig, void (handler)(int)))(int);
该函数原型来自C语言标准库 signal.h.

取消 提交回答
全部回答(7)
  • 游客x4uu57rrcwjuo
    2020-03-17 17:04:07

    右左原则

    0 0
  • 游客duzwdtzqsaq3i
    2020-03-17 11:02:39

    右左原则

    0 0
  • 一生有你llx
    2019-07-17 19:30:58

    在对上面的例子作分析之前,我们需要了解C语言的声明优先级,《C专家编程》P64原文如下:

    image

    规则A规定了要按照优先级来解释声明(算是一句废话)。规则C请参照本人上一篇笔记:http://www.cnblogs.com/deyuanqin/p/5705967.html。规则B的具体实践过程如下图:

    image

    本着抛砖引玉的目的,我们使用以上规则分析void (signal(int sig, void (handler)(int)))(int)这个复杂的声明。从易到难的顺序:

    void (*handler)(int):
    ① handler右边是圆括号,所以handler不是数组或者函数。再看其左边,是(星号),所以handler是一个指向*的指针。

    ② (handler)(int)。(handler)的右边是圆括号,因而(handler)(int)中的()(int)是一个返回的函数。结合上一步分析,handler是一个指向返回*的函数的指针。

    ③ (*handler)(int)的右边没有符号,左边是void。综上,handler是一个指向返回void值的函数的指针。

    void (signal(int sig, void (handler)(int)))(int):
    void (handler)(int)在上面的步骤已经做了分析,我们可以使用语句typedef void (handler)(int)将其简化(将handler声明为一个新的类型,这个类型是是一个指向返回void值的函数的指针。有关typedef的知识改日再做分析),则void (signal(int sig, void (handler)(int)))(int)就被简化为void (signal(int sig, handle h))(int)。下面我们对void (signal(int sig, handle h))(int)作分析:

    ① signal右边是圆括号,因而signal()是一个返回**的函数。

    ② signal()的左边是,因而signal()是一个返回指向*的指针的函数。

    ③ (signal(int sig, handle h))右边是圆括号,因此(signal(int sig, handle h))(int)是一个返回的函数。综上,signal是一个返回指向返回函数的指针的函数。

    ④ (*signal(int sig, handle h))右边是void。因而,signal(这个标识符)是一个返回指向返回void值的函数的指针的函数。

    以上的分析过程可能有错漏,请各位看官多指教。

    0 0
  • nothingfinal
    2019-07-17 19:30:58

    在对上面的例子作分析之前,我们需要了解C语言的声明优先级,《C专家编程》P64原文如下:

    image

    规则A规定了要按照优先级来解释声明(算是一句废话)。规则C请参照本人上一篇笔记:http://www.cnblogs.com/deyuanqin/p/5705967.html。规则B的具体实践过程如下图:

    image

    本着抛砖引玉的目的,我们使用以上规则分析void (signal(int sig, void (handler)(int)))(int)这个复杂的声明。从易到难的顺序:

    void (*handler)(int):
    ① handler右边是圆括号,所以handler不是数组或者函数。再看其左边,是(星号),所以handler是一个指向*的指针。

    ② (handler)(int)。(handler)的右边是圆括号,因而(handler)(int)中的()(int)是一个返回的函数。结合上一步分析,handler是一个指向返回*的函数的指针。

    ③ (*handler)(int)的右边没有符号,左边是void。综上,handler是一个指向返回void值的函数的指针。

    void (signal(int sig, void (handler)(int)))(int):
    void (handler)(int)在上面的步骤已经做了分析,我们可以使用语句typedef void (handler)(int)将其简化(将handler声明为一个新的类型,这个类型是是一个指向返回void值的函数的指针。有关typedef的知识改日再做分析),则void (signal(int sig, void (handler)(int)))(int)就被简化为void (signal(int sig, handle h))(int)。下面我们对void (signal(int sig, handle h))(int)作分析:

    ① signal右边是圆括号,因而signal()是一个返回**的函数。

    ② signal()的左边是,因而signal()是一个返回指向*的指针的函数。

    ③ (signal(int sig, handle h))右边是圆括号,因此(signal(int sig, handle h))(int)是一个返回的函数。综上,signal是一个返回指向返回函数的指针的函数。

    ④ (*signal(int sig, handle h))右边是void。因而,signal(这个标识符)是一个返回指向返回void值的函数的指针的函数。

    以上的分析过程可能有错漏,请各位看官多指教。

    0 0
  • 知钵
    2019-07-17 19:30:58

    C++/C并不是一门函数语言,函数也无法作为一等公民在这语言中出现,所以Cpp/C在传递参数为函数时(实际上传递的是函数的内存地址),都会将函数原型(函数名、参数)一并传入

    0 0
  • xumaojun
    2019-07-17 19:30:58

    在对上面的例子作分析之前,我们需要了解C语言的声明优先级,《C专家编程》P64原文如下:

    image

    规则A规定了要按照优先级来解释声明(算是一句废话)。规则C请参照本人上一篇笔记:http://www.cnblogs.com/deyuanqin/p/5705967.html。规则B的具体实践过程如下图:

    image

    本着抛砖引玉的目的,我们使用以上规则分析void (signal(int sig, void (handler)(int)))(int)这个复杂的声明。从易到难的顺序:

    void (*handler)(int):
    ① handler右边是圆括号,所以handler不是数组或者函数。再看其左边,是(星号),所以handler是一个指向*的指针。

    ② (handler)(int)。(handler)的右边是圆括号,因而(handler)(int)中的()(int)是一个返回的函数。结合上一步分析,handler是一个指向返回*的函数的指针。

    ③ (*handler)(int)的右边没有符号,左边是void。综上,handler是一个指向返回void值的函数的指针。

    void (signal(int sig, void (handler)(int)))(int):
    void (handler)(int)在上面的步骤已经做了分析,我们可以使用语句typedef void (handler)(int)将其简化(将handler声明为一个新的类型,这个类型是是一个指向返回void值的函数的指针。有关typedef的知识改日再做分析),则void (signal(int sig, void (handler)(int)))(int)就被简化为void (signal(int sig, handle h))(int)。下面我们对void (signal(int sig, handle h))(int)作分析:

    ① signal右边是圆括号,因而signal()是一个返回**的函数。

    ② signal()的左边是,因而signal()是一个返回指向*的指针的函数。

    ③ (signal(int sig, handle h))右边是圆括号,因此(signal(int sig, handle h))(int)是一个返回的函数。综上,signal是一个返回指向返回函数的指针的函数。

    ④ (*signal(int sig, handle h))右边是void。因而,signal(这个标识符)是一个返回指向返回void值的函数的指针的函数。

    以上的分析过程可能有错漏,请各位看官多指教。

    0 0
  • a123456678
    2019-07-17 19:30:58

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

                       ^^^^^^^^^^^^^^^^^^^^^
                       // 是函数指针,设为 Func1

    void (*signal(int sig, Func1))(int)

       ^^^^^^^^^^^^^^^^^^^^^^
       // 是普通函数,设为 Func2

    void (*Func2)(int)
    ^^^^^^^^^^^^^^^^^^
    // 是函数指针,设为 Func3
    Func1: void(*)(int)
    Func2: signal(int, Func1)
    Func3: void(*)(int) == Func1
    于是该函数声明可简化为:

    Func1 signal(int, Func1);
    还觉得难吗?

    再补充上用法吧,可能更加清楚:

    void my_handler (int param)
    {
    signaled = 1;
    }

    void (*prev_handler)(int); // 声明一个函数指针
    prev_handler = signal (SIGINT, my_handler);
    应该很清楚了,该函数声明中,主体是 Func2, 返回值与参数 2 的类型都是 Func1.

    0 0
滑动查看更多
相关问答

17

回答

教你如何简单将OSS bucket挂载成为阿里云ECS服务器本地盘

梦丫头 2017-02-17 14:01:12 37976浏览量 回答数 17

5

回答

【阿里云】linux服务器安装nginx配置多个站点两种方法

自娱自乐 2014-03-29 14:53:12 22433浏览量 回答数 5

9

回答

阿里云ECS安装虚拟主机系统DirectAdmin开心版百分百成功的方法

hxs 2014-05-26 20:05:30 34481浏览量 回答数 9

10

回答

AMH5.0安装脚本顺便提醒是收费的每月5元。

是非良人 2014-08-31 15:13:27 20877浏览量 回答数 10

8

回答

阿里云服务器内网传输使用指南

任逍遥 2013-03-22 00:05:42 30724浏览量 回答数 8

3

回答

2020年05月编程排行榜-C语言继2015年,重新成为编程排行榜第一名

huc_逆天 2020-05-06 13:43:42 35471浏览量 回答数 3

4

回答

上传到OSS的文件md5hash值如何获取?!!

asker 2015-08-05 16:52:10 21224浏览量 回答数 4

14

回答

C语言基础 【精品问答合集】

我是管理员 2018-07-13 15:37:00 26670浏览量 回答数 14

10

回答

阿里云centos静默安装oracle

美味的小鱼 2014-08-12 14:23:44 30636浏览量 回答数 10

5

回答

C语言算法 【精品问答合集】

我是管理员 2018-07-13 15:51:28 27063浏览量 回答数 5
+关注
0
文章
14879
问答
问答排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载