歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C標准庫函數中復雜的函數聲明

<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函數的作用是為某個信號設置新的處理函數(指針),如果成功,將返回之前的處理函數(指針)。

你可以將它返回的函數指針保存下來,方便以後重置該信號的處理函數。

Copyright © Linux教程網 All Rights Reserved