中有乙個複雜的函式宣告。很叫人費解。
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上朋友的答疑:
C 標準庫函式
有許多不同的案件中,陣列排序的可能是有用的。演算法 如搜尋看看一些存在於乙個陣列 通常可以變得更簡單和 或更有效時,輸入的資料進行排序。此外,排序是非常有用的可讀性,如當列印列表按字母順序排列的名字。排序通常是通過反覆比較的陣列元素對進行的,和交換他們如果他們滿足一些標準。為了在這些元素進行比較根據...
C 標準庫函式
c 程式通常可以呼叫標準c 庫中的大量函式。這些函式完成一些基本的服務,如輸入和輸出等,同時也為一些經常使用的操作提供了高效的 實現 這些函式中含有大量的函式和類定義,以幫助程式設計師更好地使用標準c 庫。標準c 庫包含以下內容 和 標準c 庫的詳細訊息均在其對應的標頭檔案進行了說明。主要標準c 庫...
c標準庫函式 system
宣告 int system const char command command為請求執行的shell命令構成的字元陣列。使用 char command 50 strcpy command,ls l 列出 unix 機上當前目錄下所有的檔案和目錄 int status system command ...