C++ 中的 static 資料成員屬於類別而非物件,所有實例共享同一份拷貝。這特性不僅可實作計數器,更是 MFC 核心機制(動態建立、執行期型別識別、訊息映射、命令傳遞)的基石。本文以《深入淺出 MFC》為藍本,深度解析 static 在訊息映射中的關鍵角色。
關鍵觀念:**static 成員變數不依賴物件實例化而存在,可視為「有作用域限制的全域變數」**。在進入 AfxWinMain 之前,MFC 核心類別(CWinApp、CWnd、CFrameWnd 等)的 static 成員已完成初始化,構成了訊息傳遞的靜態網狀結構。
#define DECLARE_MESSAGE_MAP() \
static AFX_MSGMAP_ENTRY _messageEntries[]; \
static AFX_MSGMAP messageMap; \
virtual AFX_MSGMAP* GetMessageMap() const;
當類別 CMyWnd : public CFrameWnd 使用此宏時,實際宣告了:
_messageEntries[]:儲存該類別的訊息條目messageMap:指向條目陣列與基類映射表GetMessageMap():執行期回傳映射表指標// MyApp.cpp
BEGIN_MESSAGE_MAP(CMyWnd, CFrameWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()
此宏在 **cpp 檔** 中 **定義** 並 **初始化** 兩個 static 成員:
CMyWnd::_messageEntries[] = { WM_PAINT 對應處理函式, 結束標記 }CMyWnd::messageMap = { _messageEntries, &CFrameWnd::messageMap }**關鍵點**:這兩個 static 變數在 **程式啟動、全域物件建構階段** 就已存在,完全 **不需要建立 CMyWnd 物件**。MFC 啟動流程:
AfxWinMainCWinApp 衍生物件、主視窗等因此,訊息路由表在第一個視窗建立前已就緒,佔用固定記憶體,換取極快的訊息分派速度。
MFC 巧妙運用 static 的「編譯期存在、類別級共享」特性,在無物件時建立完整的訊息映射網。這不僅是技巧,更是框架設計權衡 **效能、靈活度、記憶體** 的經典案例。理解此機制,有助於深入掌握 MFC 訊息路由、命令傳遞與執行期型別識別的本質。