問題提出
請分析此聲明:void (*signal(int sig, void (*handler)(int)))(int);
求解過程
在對上面的例子作分析之前,我們需要了解C語言的聲明優先級,《C專家編程》P64原文如下:
規則A規定了要按照優先級來解釋聲明(算是一句廢話)。規則C請參照本人上一篇筆記:http://www.cnblogs.com/deyuanqin/p/5705967.html。規則B的具體實踐過程如下圖:
本着拋磚引玉的目的,我們使用以上規則分析void (*signal(int sig, void (*handler)(int)))(int)這個復雜的聲明。從易到難的順序:
1. void (*handler)(int):
① handler右邊是圓括號,所以handler不是數組或者函數。再看其左邊,是*(星號),所以handler是一個指向****的指針。
② (*handler)(int)。(*handler)的右邊是圓括號,因而(*handler)(int)中的()(int)是一個返回****的函數。結合上一步分析,handler是一個指向返回****的函數的指針。
③ (*handler)(int)的右邊沒有符號,左邊是void。綜上,handler是一個指向返回void值的函數的指針。
2. void (*signal(int sig, void (*handler)(int)))(int):
void (*handler)(int)在上面的步驟已經做了分析,我們可以使用語句typedef void (*handler)(int)將其簡化(將handler聲明為一個新的類型,這個類型是是一個指向返回void值的函數的指針。有關typedef的知識改日再做分析),則void (*signal(int sig, void (*handler)(int)))(int)就被簡化為void (*signal(int sig, handle h))(int)。下面我們對void (*signal(int sig, handle h))(int)作分析:
① signal右邊是圓括號,因而signal()是一個返回****的函數。
② signal()的左邊是*,因而signal()是一個返回指向****的指針的函數。
③ (*signal(int sig, handle h))右邊是圓括號,因此(*signal(int sig, handle h))(int)是一個返回****的函數。綜上,signal是一個返回指向返回****函數的指針的函數。
④ (*signal(int sig, handle h))右邊是void。因而,signal(這個標識符)是一個返回指向返回void值的函數的指針的函數。
以上的分析過程可能有錯漏,請各位看官多指教。
參考資料
1.《C專家編程》P65圖3-1
2.博客http://blog.csdn.net/jiuyueguang/article/details/9350903