问题提出

请分析此声明:void (*signal(int sig, void (*handler)(int)))(int);

求解过程

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

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

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

1. void (*handler)(int):

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

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

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

2. 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值的函数的指针的函数

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

参考资料

1.《C专家编程》P65图3-1

2.博客http://blog.csdn.net/jiuyueguang/article/details/9350903

C语言复杂声明-void (*signal(int sig, void (*handler)(int)))(int);的更多相关文章

  1. void (*signal(int sig, void (*func) (int))) (int)理解

    http://blog.csdn.net/sever2012/article/details/8281271 1.signal( int sig, void (*func)(int))signal是一 ...

  2. signal函数:void (*signal(int,void(*)(int)))(int);

    http://blog.chinaunix.net/uid-20178794-id-1972862.html signal函数:void (*signal(int,void(*)(int)))(int ...

  3. 《C专家编程》第三章——分析C语言的声明

    前面一章我们已经说过C语言存在的一些问题和它晦涩的地方,让我们对这门神奇的语言有了更深的了解.现在这一章则集中精力来讨论C语言的声明,分为三块,首先是说明C语言声明晦涩难懂的原因和声明是如何形成的,其 ...

  4. 浅谈C语言变量声明的解析

    C语言本身提供了一种不甚明确的变量声明方式——基于使用的声明,如int *a,本质上是声明了*a的类型为int,所以得到了a的类型为指向int的指针.对于简单类型,这样声明并不会对代码产生多大的阅读障 ...

  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. 如何理解这段代码:void (*signal (int sinno,void(*func)(int)))(int)

    void (*signal (int sinno,void(*func)(int)))(int) 先来看void(*func)(int)   这里的意思是声明一个函数指针func,它的参数类型为int ...

  7. signal函数理解或者void (*signal(int signum,void(*handler)(int)))(int)理解

    把void (*signal(int signum,void(*handler)(int)))(int)分成两部分: typedef void (*sighandler_t)(int); sighan ...

  8. 简单理解函数声明(以signal函数为例)

    这两天遇到一些声明比较复杂的函数,比如signal函数,那我们先简单说说signal函数的用法:(参考<c陷阱与缺陷>) [signal:几乎所有c语言程序的实现过程中都要用到signal ...

  9. C语言复杂声明

    C语言复杂声明 First step int *f(); /* f:是一个函数,它返回一个指向int类型的指针*/ int (*pf)(); /* pf:是一个指向函数的指针,该函数返回一个int类型 ...

随机推荐

  1. Unity3D 中的协程

    若干文章: 1.Coroutine,你究竟干了什么? 2.Radical Coroutines 3.Extended Unity Coroutines

  2. 使用 Box2D 做一个 JansenWalker 机器人

    在 Box2DFlash 的官网的首页有一个小 Demo,这个 Demo 中有11个例子,可以通过左右方向键查看不同的例子,里面的每个例子都非常有趣,但最让我感兴趣的,是其中一个叫 JansenWal ...

  3. angularJs|es6|reactJs|vueJs相关技术(请访问https://expendo.github.io/)

    技术博客地址:https://expendo.github.io/

  4. Mac OS 下 mysql 找不到 mysql.sock 的问题

    mysql.sock 无法找到一般存在两种问题,一是mysql服务未启动,mysql.sock没有生成,二是mysql.sock的指向位置出错,在指向位置加个mysql.sock的软链接就可以解决. ...

  5. 常看常遇见之一——BS架构VS CS架构

    常看常遇见之一——BS架构VS CS架构 1.BS架构 即Browser/Server(浏览器/服务器)结构,是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构.在这种结构下,用户 ...

  6. 四核RP4412开发板使用Xshell连接的com口应与电脑端口一致

    使用Xshell工具连接的com口要与电脑接的com口端号一样. 问:我的RP4412开发板现在按照<烧写视频>操作,在XSHELL软件里找不到板子的串口号.我用的XP系统装了USB转串口 ...

  7. Oracle查询

    1.普通查询 select * from 表格 查询所有内容 select 列名,列名 from 表格查询某几列 2.条件查询 select * from 表格 where 条件 条件查询 selec ...

  8. mysql创建用户及授权相关命令

    移步: https://zhidao.baidu.com/question/1576368583039067980.html

  9. 详解.Net消息队列(MSMQ)应用

    [IT168 技术文档]MSMQ是Windows 2000.Windows XP.Windows Server 2003的一个组件,并将继续包含在Windows Vista和以后的Windows服务器 ...

  10. WebForm使用AngularJS实现下拉框多级联动

    数据准备 ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,                                             CateId = ,        ...