C標準庫函式中複雜的函式宣告

2021-09-20 06:49:49 字數 1015 閱讀 5368

中有乙個複雜的函式宣告。很叫人費解。

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 ...