淺談——void (*signal(int, void (*)(int)))(int) 函數聲明

先說結論:這是一個返回類型是函數指針的函數聲明,該函數的參數是一個int類型和一個函數指針

現在我們先拋開上面那個複雜的定義,先看一下下面的需求

  1. 定義一個函數;
  2. 該函數具有以下特點,兩個參數,返回值是函數指針,並且一個參數也是函數指針。假如返回值和參數函數指針同爲void (*)(int); 另一個函數參數是int型。該函數定義名稱爲my_func。

根據需求我們可以很容易定義出這種函數:

typedef void (*HANDLER)(int); // 參數函數和返回函數定義

HANDLER my_func(int, HANDLER);

突然需求中又不讓使用typedef,這就是早期C語言不支持typedef的情況,那麼如何定義這種函數呢?我們假如說my_func的返回值是int,是不是它的定義可以這麼寫:

int my_func(int, void (*)(int));

也就是說,my_func(int, void (*)(int))就是一個int型數據。現在將int換成一個函數,也就是

 void (*)(int) my_func(int, void (*)(int);

這樣一種定義,顯然這種語法不支持,那麼,實際是如何表示呢?回過頭來,我們先看看函數指針的聲明格式

       void (*pfunc)(int)

其中pfunc 等價於 void ()(int)。現在在看看上面的格式,是不是很相識,對了,pfunc就是my_func(int, void ()(int))。現在如果將兩者代替一下是不是就成了這種格式:

       void (*my_func(int, void(*)(int)))(int)

如果將my_func換成signal,是不是就是我們文章開始提到的那個複雜聲名?現在是不是明白了,原來如此啊,它是一個返回函數指針的的函數聲名!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章