<signal.h>
中有一个复杂的函数声明。很叫人费解。
void (*signal(int sig, void (*handler)(int)))(int);
我们按照向右看向左看的黄金法则来分析这个函数声明。如果你不明白我在讲什么,请看 读懂C复杂声明的黄金法则。
首先这个声明的主体是signal,这个应该没有争议。
向右看,(int sig, void (*handler)(int))
,括号和参数,说明signal是一个函数。
第一个整形参数sig
不用多讲,第二个参数比较复杂 void (*handler)(int)
,这是一个函数指针,它指向的函数接收一个整形参数,没有返回值。
向左看,发现一个*
,说明signal函数返回的是一个指针。
向右看,向左看,是一对(),这怎么理解。(*)
表明是一个函数指针,就是说signal
函数的返回值是一个函数指针。
再向右看,(int)
,说明signal返回的函数指针指向的函数接受一个整形参数。
向左看,是void
,说明signal返回的函数指针指向的函数没有返回值。
综合来看,这个声明,是一个名叫signal的函数声明,其主体是 signal(int, void (*)(int))
,其返回值是void (*)(int)
。
分成这样写就清楚多了。
typedef void (*callback)(int);
callback signal(int sig, callback handler);
signal函数的作用是为某个信号设置新的处理函数(指针),如果成功,将返回之前的处理函数(指针)。
你可以将它返回的函数指针保存下来,方便以后重置该信号的处理函数。
感谢SegmentFault上朋友的答疑: http://segmentfault.com/q/1010000002626356
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。