解析經典難懂聲明 void (*f(int, void (*)(int)))(int),掌握函數指針聲明的通用讀取方法與 typedef 簡化技巧。
void (*f(int, void (*)(int)))(int)
f 是聲明的主體(int, void (*)(int)) → f 是函數,接受兩個參數:
int:整數void (*)(int):函數指針,指向 void func(int) 類型函數* → f 返回指針(int) → 返回的指針指向函數,接受 int 參數void → 該函數返回 voidf 是一個函數,參數為 (int, 函數指針),返回一個函數指針,該指針指向 void (*)(int) 類型函數。
1. 從標識符開始 2. 向右讀到 ) 或結束 3. 向左讀到 * 或開頭 4. 重複 2-3 直到解析完畢
// 定義函數指針類型別名
typedef void (*Handler)(int);
// 簡化聲明
Handler f(int, Handler);
// 等價於:void (*f(int, void (*)(int)))(int)
signal(int sig, void (*handler)(int))
// 函數指針類型為:void (*)(int)
// 地址 0x8999940 轉換為該類型:
pfunc = (void (*)(int)) 0x8999940;
// 原理:聲明中除標識符外的部分即為類型
void (*signal(int sig, void (*func)(int)))(int);
// signal 是函數,參數:int, 函數指針
// 返回:函數指針,指向 void (*)(int)
掌握聲明解析法,不再懼怕任何複雜函數指針類型。