C/C++ 無原生閉包,但可透過函式指標實現回呼:呼叫端將函式位址傳遞給被呼叫端,被呼叫端在適當時機透過指標間接呼叫。
#include <stdio.h>
// 1. 定義回呼函式簽名
typedef void (*CallbackFunc)(const char *message);
// 2. 結構體持有函式指標
struct Handler {
CallbackFunc callback;
};
// 3. 實際業務邏輯
void doSomething(const char *job) {
printf("處理工作: %s\n", job);
}
// 4. 註冊與觸發
int main() {
struct Handler h;
h.callback = doSomething; // 註冊
h.callback("something"); // 回呼執行
return 0;
}
typedef void (*CallbackEx)(void *ctx, const char *msg);
struct HandlerEx {
CallbackEx callback;
void *context; // 攜帶任意上下文資料
};
void logger(void *ctx, const char *msg) {
FILE *fp = (FILE*)ctx;
fprintf(fp, "[LOG] %s\n", msg);
}
int main() {
FILE *log = fopen("app.log", "a");
struct HandlerEx h = { logger, log };
h.callback(h.context, "系統啟動");
fclose(log);
return 0;
}
#include <functional>
#include <iostream>
class EventDispatcher {
std::function callback_;
public:
void setCallback(std::function cb) { callback_ = cb; }
void trigger(const std::string& msg) { if (callback_) callback_(msg); }
};
int main() {
EventDispatcher disp;
disp.setCallback([](const std::string& s){ std::cout << "Lambda: " << s << '\n'; });
disp.trigger("Hello Callback");
return 0;
}
| 場景 | C 風格 | C++ 現代 |
|---|---|---|
| 事件迴圈/訊號處理 | 函式指標 + void* context | std::function + lambda |
| 排序/搜尋自訂比較 | qsort 比較函式指標 | std::sort + lambda |
| 非同步完成通知 | 回呼函式指標 | std::future / coroutine |
| 插件架構 | 函式表結構體 | 介面類別 + 虛擬函式 |
__stdcall,確保宣告一致。函式指標回呼是系統程式設計的基石,掌握其 C 與 C++ 兩種風格,能靈活應對從嵌入式裝置到高階應用框架的各種非同步、事件驅動需求。