C語言復雜聲明-void (*signal(int sig, void (*handler)(int)))(int);


問題提出

請分析此聲明: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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM