首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言進階技巧:使用 typedef 簡化函式指標宣告與回調函式實作

     編輯:關於C語言

C語言進階技巧:使用 typedef 簡化函式指標宣告與回調函式實作

函式指標語法晦澀難記,善用 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;
}

實戰應用場景

  • qsort 比較函式:int (*compar)(const void*, const void*)
  • 訊號處理:signal(sig, handler) 中的 handler
  • 事件循環:GUI、網路框架的回調註冊
  • 插件架構:主程式定義介面,外掛實作具體函式
  • 物件導向模擬:結構體內嵌函式指標作為「方法」

避坑指南

  1. 函式指標賦值時不加括號:pFun = func1; 而非 pFun = func1();
  2. 呼叫時可加可不加解參考:pFun(); 與 (*pFun)(); 等價
  3. 嚴格匹配參數個數、類型、回傳類型,否則未定義行為
  4. 搭配 typedef 讓複雜宣告(如回傳函式指標的函式指標)可讀

函式指標是 C 語言實現多型、回調、策略模式的核心機制,配合 typedef 驯服其語法複雜度,能寫出極具彈性的系統級程式碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved