signal函数来自《C陷阱与缺陷》

转自:http://guoznhua.blog.tianya.cn

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

  
  这个例子来自《C陷阱与缺陷》……
  
  signal函数是著名的信号函数,但是它的定义却非常的复杂……
  
  任何C变量,都是由“类型”+“表达式”组成,它表示,对“表达式”求值,返回的类型,是声明给定的“类型”的值,如
  int a;
  也就是对表达式a求值,是一个int类型;
  同样地,
  int func();
  这个声明的含义是,对表达式func()求值结果是一个int类型,也就是说,func是一个返回值是int类型的函数。
  进一步,
  int *a;
  也就是,*a是一个整型变量,那a当然就是一个指针,一个指向整型类型变量的指针;
  那么,
  int *func();
  同样地,因为()的优先级高于*,所以func是一个函数,它返回一个整型变量指向整型变量的指针;
  进一步地,
  int (*func)();
  这一回*被括号括了起来,因为*被先执行,所以,func自然地是一个指针,它指向的类型是一个函数,即func是一个指向函数的指针,并且,这个函数,返回一个整型变量。
  
  另一个要讨论的问题是,如何得到一个类型指定的类型转换符,比如:
  int a;
  float b;
  要强制b转换为int类型,需要把
  int a;
  中的变量名去掉,然后把末尾的;去掉,再把剩余的部份用括号括起来,即:
  (int)
  所以,以下表达式:
  int (*func)();
  如果我们要得到对应的函数指针的类型转换符,则把func去掉,再把;去掉,再用括号
  把剩余的部份括起来,即:
  (int (*)())
  表示一个“指向返回值为整型类型的函数的指针”的类型转换符。
  那么,如果要将常数0,转换为一个函数指针,且这个函数返回值类型为void类型,应该如何表示呢?
  根据上面所说,
  (void (*)())
  这个也就不用再解释,那么,要强制类型转换也很简单:
  (void (*)())0
  现在,它已经是一个函数指针了,把它简写为fp:
  #define fp (void (*)())0
  要调用这个函数指针,很简单,
  (*fp)()
  当然,fp是一个函数指针,这样的调用形式,可以简写为
  fp()
  ,当然,这仅仅是简写……
  所以,(*fp)(),把fp这个宏展开:
  就是
  (*(void (*)())0)()
  这么复杂的东东,其实很简单,就是先为常数0进行类型转换,转换为一个“指向返回类型为void的函数指针”,然后
  再调用它。
  用typedef来简化(*(void (*)())0)():
  typedef void (*funcptr)();
  (*(funcptr)0)();
  著名的signal函数的声明,就是这样啦:
  void (*signal(int,void(*)(int))(int);
  同样地,用typedef可以简化它:
  typedef void (*HANDLER)(int);
  HANDLER signal(int,HANDLER);
  这已经是我们习惯看到的形式了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值