函數指針難點不在語法,而在「識別合適場景」。以下四大核心場景覆蓋 90% 以上實戰用例。
痛點:分層原則要求上層調下層,下層不可直接調上層。但下層(如文件拷貝)掌握進度,上層(UI)掌握進度條繪製。
方案:上層注冊回調函數指針給下層,下層在關鍵節點調用回調通知上層。
本質:控制反轉 (IoC) 雛形,下層不依賴上層具體實現,僅依賴函數指針簽名。
介面 = 一組函數指針。Linux 內核大量採用:
struct file_operations 定義 open/read/write/ioctl 等函數指針,各文件系統(ext4, tmpfs, procfs)填寫實現,內核統一調度。struct device_driver、struct bus_type 均以函數指針表定義介面。GTK+、WebKit 等用戶態庫同理。C 語言無虛函數,函數指針表即手動虛表。
《設計模式》首條原則:針對介面編程,而非實現。C 語言實現橋接、策略、狀態、代理等模式,核心均為函數指針表作為介面,具體實現動態綁定。
效果:變化點封裝在 Concrete 實現中,Client 僅依賴穩定介面,修改/擴展不波及調用方。
問題:對象 A 狀態變化,對象 B、C 需感知。直接調用導致緊耦合(A 需知 B、C 類型)。
信號機制 (Glib Signal, Boost.Signal, Qt Signal/Slot):
connect)。這是觀察者模式的工業級實現,函數指針是核心載體。
| 維度 | 關鍵詞 | 核心作用 |
|---|---|---|
| 架構 | 分層/回調 | 打破單向調用限制,實現控制反轉 |
| 抽象 | 介面/虛表 | C 語言實現多態、插件架構、驅動模型 |
| 設計 | 策略/橋接/狀態 | 隔離變化,針對介面編程,支持熱插拔 |
| 耦合 | 信號/槽/觀察者 | 發布-訂閱,零直接依賴,極致鬆耦合 |
函數指針是 C 語言實現多態、擴展性、鬆耦合的基石。掌握其在分層、抽象、設計模式、信號機制中的四大核心場景,即掌握了 C 進階架構設計的靈魂。