多年來,我始終在嵌入式領域摸爬滾打——從校園時期的硬體驅動層、底層功能層,到職場上的手機軟體開發。雖然 C++ 效能與編譯器已大幅進步,但在資源受限、即時性要求高的嵌入式系統中,C 語言仍是絕對主力。編譯器支援度、程式碼體積、執行效率、團隊慣性等因素交織,使得 C 語言的統治地位短期內難以撼動。
面向對象非關語法糖,其核心目的是「框架化」,手段是「抽象」。
#define MacroFunction AFunction
// 需切換時:#define MacroFunction BFunction
編譯期靜態綁定,僅適用於全域替換,缺乏執行期靈活性。
long Nilan(int FunctionCode, Para *param) {
switch(FunctionCode) {
case SendPacket: send(...); break;
case ReceivePacket: receive(...); break;
// ...
}
}
網卡驅動與協議棧僅透過單一入口函數耦合。介面限制:雙方僅知有限功能;名稱解析:建立功能碼與實現的映射。新增功能只需擴充功能碼,不修改介面簽名,體現開閉原則雛形。
函數指標讓函數在無需重新編譯的情況下註入新行為。雖涉及雙重間接存取、可能導致程式碼「支離破碎」(難以靜態追蹤呼叫鏈),但在非極致效能場景下,其靈活性極具價值。配合先進框架可緩解可讀性問題。
具體函數呼叫造成強耦合。事件/訊息機制以「名稱解析」取代直接呼叫,雙方遵循共同協定即可協作。更進一步,它天然支援行程間通訊:控制中心(訊息佇列 + 分發迴圈)接收訊息並分發至目標行程,實現動態掛載/卸載模組。事件傾向通知「發生了什麼」,訊息傾向指令「做什麼」,本質相同,語意不同。
先抽象出骨架(框架化),再考慮邊界條件、擴充點、極端情況。C 語言雖無原生類別語法,但結構體、函數指標、不透明指標、模組化編譯等機制,足以構建具備封裝、繼承、多型特質的系統。面向對象是思維方法,而非語言專利。