免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1362 | 回复: 0
打印 上一主题 下一主题

signal函数:void (*signal(int,void(*)(int)))(int); [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-03 12:59 |只看该作者 |倒序浏览

signal函数:void (*signal(int,void(*)(int)))(int);
2008-04-11 15:26:02
signal函数:void (*signal(int,void(*)(int)))(int)
#include
  void (*signal (int sig, void (*func)(int)))(int);
That is to say, signal is a function that returns a pointer to another function. This second function takes a single int argument and returns void. The second argument to signal is similarly a pointer to a function returning void which takes an int argument.
这个例子来自《C陷阱与缺陷》……
signal函数是著名的信号函数,但是它的定义却非常的复杂……
任何C变量,都是由“类型”+“表达式”组成,它表示,对“表达式”求值,返回的类型,是声明给定的“类型”的值,如
[/url]
[url=http://www.skynet.org.cn/viewthread.php?tid=5#]

CODE:
int a;也就是对表达式a求值,是一个int类型;
同样地,
[/url]
[url=http://www.skynet.org.cn/viewthread.php?tid=5#]

CODE:
int func();这个声明的含义是,对表达式func()求值结果是一个int类型,也就是说,func是一个返回值是int类型的函数。
进一步,
[/url]
[url=http://www.skynet.org.cn/viewthread.php?tid=5#]

CODE:
int *a;也就是,*a是一个整型变量,那a当然就是一个指针,一个指向整型类型变量的指针;
那么,
[/url]
[url=http://www.skynet.org.cn/viewthread.php?tid=5#]

CODE:
int *func();同样地,因为()的优先级高于*,所以func是一个函数,它返回一个整型变量指向整型变量的指针;
进一步地,
[/url]
[url=http://www.skynet.org.cn/viewthread.php?tid=5#]

CODE:
int (*func)();这一回*被括号括了起来,因为*被先执行,所以,func自然地是一个指针,它指向的类型是一个函数
,即func是一个指向函数的指针,
并且,这个函数,返回一个整型变量。
另一个要讨论的问题是,如何得到一个类型指定的类型转换符,比如:
int a;
float b;
要强b转换为int类型,需要把
int a;
中的变量名去掉,然后把末尾的;去掉,再把剩余的部份用括号括起来,即:
(int)
所以,以下表达式:
int (*func)();
如果我们要得到对应的函数指针的类型转换符,则把func去掉,再把;去掉,再用括号
把剩余的部份括起来,即:
[/url]
[url=http://www.skynet.org.cn/viewthread.php?tid=5#]

CODE:
(int (*)())表示一个“指向返回值为整型类型的函数的指针”的类型转换符。
那么,如果要将常数0,转换为一个函数指针,且这个函数返回值类型为void类型,应该如何表示呢?
根据上面所说,
(void (*)())
这个也就不用再解释,那么,要强制类型转换也很简单:
(void (*)())0
现在,它已经是一个函数指针了,把它简写为fp:
#define fp (void (*)())0
要调用这个函数指针,很简单,
(*fp)()
当然,fp是一个函数指针,这样的调用形式,可以简写为
fp()
,当然,这仅仅是简写……
所以,(*fp)(),把fp这个宏展开:
就是
[/url]
[url=http://www.skynet.org.cn/viewthread.php?tid=5#]

CODE:
(*(void (*)())0)()这么复杂的东东,其实很简单,就是先为常数0进行类型转换,转换为一个“指向返回类型为void的函数指针”,然后
再调用它。
用typedef来简化(*(void (*)())0)():
[/url]
[url=http://www.skynet.org.cn/viewthread.php?tid=5#]

CODE:
typedef void (*funcptr)();
(*(funcptr)0)();著名的signal函数的声明,就是这样啦:
[/url]
[url=http://www.skynet.org.cn/viewthread.php?tid=5#]

CODE:
void (*signal(int,void(*)(int))(int);同样地,用typedef可以简化它:
[/url]
[url=http://www.skynet.org.cn/viewthread.php?tid=5#]

CODE:
typedef void (*HANDLER)(int);
HANDLER signal(int,HANDLER);这已经是我们习惯看到的形式了。

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/103668/showart_2044640.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP