原文連接:http://mikelee.blog.51cto.com/1980033/372423編程
typedef聲明自定義數據類型,配合各類原有數據類型來達到簡化編程的目的。對於char (*(*x())[5])(); 咱們可利用typedef來簡化。數組
先定義:typedef char (*Fun)(); 那麼:char (*(*x())[5])(); => Fun (*x())[5];再定義:typedef Fun A[5]; 那麼:Fun (*x())[5]; => A *x(); 對於這種形式正是咱們最熟悉的函數聲明類型。函數
根據上面的簡化模式,可逐步描述char (*(*x())[5])();的含義:
第一步:A *x();
聲明x是一個輸入參數爲空且返回A的指針類型的函數。
第二步:Fun (*x())[5]; 聲明x是一個輸入參數爲空且返回指向含有5個Fun類型數組的指針的函數。
第三步:char (*(*x())[5])(); 聲明x是一個輸入參數爲空且返回指向含有5個指向函數指針且返回值爲字符類型的數組指針的函數。
利用上述的方法,幾乎能夠理解任何複雜類型的聲明,例如Linux系統調用函數signal的函數原型以下:
void (*signal(int signo,void (*func)(int))) (int);
對於該函數原型,給人的第一感受就是複雜,不知從何下手。其實一樣能夠利用上面所講的typedef聲明來簡化:先定義typedef void (*sighandler_t)(int); 那麼void (*signal(int signo,void (*func)(int))) (int); => sighandler_t signal(int signo, sighandler_t handler);
對於sighandler_t signal(int signo, sighandler_t handler); 就和咱們常見的函數聲明很是相似了,惟一不一樣的是sighandler_t不是咱們常見的基本數據類型,假如你不知道sighandler_t具體是什麼類型,爲了快速理解sighandler_t signal(int signo, sighandler_t handler);的含義,你能夠把sighandler_t想象成爲你最熟悉的int或char類型,對於int signal(int signo, int handler);你會很輕鬆的理解,對於sighandler_t signal(int signo, sighandler_t handler);你只須要了解sighandler_t的類型(即typedef void (*sighandler_t)(int);),就能夠理解signal函數的完整原型聲明。