二級C宏--智者的利刃,愚者的惡夢(中)

字號:

例三、用C宏,自動生成代碼這方面的例子也是多得很,不過有鑒于很多朋友不用很多編譯器,不做嵌入式的開發(fā),我就舉個win平臺的例子吧。我們知道MFC實現(xiàn)了windows的消息映射,比如:
    ON_COMMAND(IDM_ABOUT, OnAbout)
    ON_COMMAND(IDM_FILENEW, OnFileNew)
    它是如何實現(xiàn)的IDM_ABOUT和OnAbout的關(guān)聯(lián)的呢?這要用到幾個宏。
    #define DECLARE_MESSAGE_MAP() \
    private: \
    static const AFX_MSGMAP_ENTRY _messageEntries[]; \
    protected: \
    static AFX_DATA const AFX_MSGMAP messageMap; \
    virtual const AFX_MSGMAP* GetMessageMap() const; \
    #define BEGIN_MESSAGE_MAP(theClass, baseClass) \
    const AFX_MSGMAP* theClass::GetMessageMap() const \
    { return &theClass::messageMap; } \
    AFX_COMDAT AFX_DATADEF const AFX_MSGMAP theClass::messageMap = \
    { &baseClass::messageMap, &theClass::_messageEntries[0] }; \
    AFX_COMDAT const AFX_MSGMAP_ENTRY theClass::_messageEntries[] = \
    { \
    #define ON_COMMAND(id, memberFxn) \
    { WM_COMMAND, 0, (WORD)id, (WORD)id, AfxSig_vv, (AFX_PMSG)memberFxn },
    #define END_MESSAGE_MAP() \
    {0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 } \
    }; \
    #define DECLARE_MESSAGE_MAP() \
    private: \
    static const AFX_MSGMAP_ENTRY _messageEntries[]; \
    protected: \
    static AFX_DATA const AFX_MSGMAP messageMap; \
    virtual const AFX_MSGMAP* GetMessageMap() const; \
    #define BEGIN_MESSAGE_MAP(theClass, baseClass) \
    const AFX_MSGMAP* theClass::GetMessageMap() const \
    { return &theClass::messageMap; } \
    AFX_COMDAT AFX_DATADEF const AFX_MSGMAP theClass::messageMap = \
    { &baseClass::messageMap, &theClass::_messageEntries[0] }; \
    AFX_COMDAT const AFX_MSGMAP_ENTRY theClass::_messageEntries[] = \
    { \
    #define ON_COMMAND(id, memberFxn) \
    { WM_COMMAND, 0, (WORD)id, (WORD)id, AfxSig_vv, (AFX_PMSG)memberFxn },
    #define END_MESSAGE_MAP() \
    {0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 } \
    }; \
    嘿嘿,就這么幾個宏,就構(gòu)造出一個消息數(shù)組來。