函式指標語法晦澀難記,善用 typedef 可大幅提升可讀性。本文示範如何定義函式指標類型別名,並實作簡單的回調機制,模擬事件驅動或策略模式。
// 無 typedef:直接宣告變數 void (*pf)(int, int); // 指向 void(int,int) 的指標 void (*pf_arr[5])(int, int); // 5 個這類指標的陣列 // 有 typedef:先定義類型別名 typedef void (*Callback)(int, int); // Callback 現在是一個類型 Callback pf; // 宣告變數 Callback pf_arr[5]; // 宣告陣列 Callback *ppf; // 指向函式指標的指標
#include <stdio.h>
// 1. 定義函式指標類型別名
typedef void (*Fun)(void);
// 2. 兩個符合簽名的函式
void func1(void) { printf("function_1 執行\n"); }
void func2(void) { printf("function_2 執行\n"); }
// 3. 接受回調的高階函式
void execute_callback(Fun callback, const char *msg) {
printf(">>> %s <<<\n", msg);
callback(); // 呼叫傳入的函式
}
int main() {
// 直接指派
Fun pFun = func1;
pFun(); // 輸出 function_1
// 執行期切換
pFun = func2;
pFun(); // 輸出 function_2
// 作為參數傳遞 (回調模式)
execute_callback(func1, "第一次回調");
execute_callback(func2, "第二次回調");
return 0;
}
typedef int (*BinaryOp)(int, int);
int add(int a, int b) { return a + b; }
int mul(int a, int b) { return a * b; }
int calculate(int a, int b, BinaryOp op) {
return op(a, b); // 策略模式:演算法外部注入
}
int main() {
printf("10 + 5 = %d\n", calculate(10, 5, add));
printf("10 * 5 = %d\n", calculate(10, 5, mul));
return 0;
}
int (*compar)(const void*, const void*)signal(sig, handler) 中的 handlerpFun = func1; 而非 pFun = func1();pFun(); 與 (*pFun)(); 等價typedef 讓複雜宣告(如回傳函式指標的函式指標)可讀函式指標是 C 語言實現多型、回調、策略模式的核心機制,配合 typedef 驯服其語法複雜度,能寫出極具彈性的系統級程式碼。