<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函數的作用是為某個信號設置新的處理函數(指針),如果成功,將返回之前的處理函數(指針)。
你可以將它返回的函數指針保存下來,方便以後重置該信號的處理函數。