C语言复杂声明-void (*signal(int sig, void (*handler)(int)))(int);
问题提出
请分析此声明: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);的更多相关文章
- void (*signal(int sig, void (*func) (int))) (int)理解
http://blog.csdn.net/sever2012/article/details/8281271 1.signal( int sig, void (*func)(int))signal是一 ...
- signal函数:void (*signal(int,void(*)(int)))(int);
http://blog.chinaunix.net/uid-20178794-id-1972862.html signal函数:void (*signal(int,void(*)(int)))(int ...
- 《C专家编程》第三章——分析C语言的声明
前面一章我们已经说过C语言存在的一些问题和它晦涩的地方,让我们对这门神奇的语言有了更深的了解.现在这一章则集中精力来讨论C语言的声明,分为三块,首先是说明C语言声明晦涩难懂的原因和声明是如何形成的,其 ...
- 浅谈C语言变量声明的解析
C语言本身提供了一种不甚明确的变量声明方式——基于使用的声明,如int *a,本质上是声明了*a的类型为int,所以得到了a的类型为指向int的指针.对于简单类型,这样声明并不会对代码产生多大的阅读障 ...
- 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 ...
- 如何理解这段代码:void (*signal (int sinno,void(*func)(int)))(int)
void (*signal (int sinno,void(*func)(int)))(int) 先来看void(*func)(int) 这里的意思是声明一个函数指针func,它的参数类型为int ...
- signal函数理解或者void (*signal(int signum,void(*handler)(int)))(int)理解
把void (*signal(int signum,void(*handler)(int)))(int)分成两部分: typedef void (*sighandler_t)(int); sighan ...
- 简单理解函数声明(以signal函数为例)
这两天遇到一些声明比较复杂的函数,比如signal函数,那我们先简单说说signal函数的用法:(参考<c陷阱与缺陷>) [signal:几乎所有c语言程序的实现过程中都要用到signal ...
- C语言复杂声明
C语言复杂声明 First step int *f(); /* f:是一个函数,它返回一个指向int类型的指针*/ int (*pf)(); /* pf:是一个指向函数的指针,该函数返回一个int类型 ...
随机推荐
- 即时聊天IM之二 openfire 整合现有系统用户
合肥程序员群:49313181. 合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q Q:408365330 E-Mail:egojit@qq.com 综述: ...
- 51nod 1174 1174 区间中最大的数
题目链接:51nod 1174 1174 区间中最大的数 ST(Sparse Table)算法学习参考博客:http://blog.csdn.net/niushuai666/article/detai ...
- 一个会Flash的人来说CSS3
以前在上大学的时候学过Flash,而且以前做一些网页效果都是用的Flash,现在才知道以前我所用的方法是有多麻烦.在学过CSS3之后,我发现以前要用Flash写半天的效果,现在用几句CSS3代码就搞定 ...
- java selenium (三) 环境搭建 基于Maven
现在Java的大部分项目都是基于Maven, 在Maven项目中使用Selenium2. 非常简单. 首先你需要配置好Maven的环境 可以参考本博客的Maven教程系列,Maven入门教程(一) ...
- Socket通信 简单实现私聊、群聊(dos命令下)
很久以前的一个Demo,这里服务器只做转发功能,根据ID地址和端口号来标识身份,群聊和私聊只是简单实现, 服务器代码如下: import java.util.*; import java.io.*; ...
- PHP7 错误处理
最近学习了下PHP7新特性教程,记录了一些学习笔记. PHP 7 改变了大多数错误的报告方式.不同于 PHP 5 的传统错误报告机制,现在大多数错误被作为 Error 异常抛出. 这种 Error 异 ...
- codevs 钢丝塔的庆生
#include <cstdio> #include <cmath> const int MOD = 9999991; int table[MOD + 1]; void cre ...
- 【 2013 Multi-University Training Contest 4 】
HDU 4632 Palindrome subsequence dp[x][y]表示区间[x,y]构成回文串的方案数. 若str[x]==str[y],dp[x][y]=dp[x+1][y]+dp[x ...
- Windows 通用应用尝试开发 “51单片机汇编”总结
一.前言 终于完成windows通用应用“51单片机汇编”,半年前开始玩WindowsPhone开发的第一个真正意义上的App(还很多缺点=_=).开发从1月中旬考完试到今天,期间实习了半个月,玩了几 ...
- failed to open the runspace pool. the server manager winrm plug-in might be corrupted or missing
添加对127.0.0.1的监听 netsh http add iplisten 127.0.0.01 添加完后的效果