class __declspec(novtable) CIOMessageMap
{
public:
virtual bool ProcessIOMessage(IOType clientIO, ClientContext* pContext, DWORD dwSize) = 0;
};#define BEGIN_IO_MSG_MAP() \
public: \
bool ProcessIOMessage(IOType clientIO, ClientContext* pContext, DWORD dwSize = 0) \
{ \
bool bRet = false; #define IO_MESSAGE_HANDLER(msg, func) \
if (msg == clientIO) \
bRet = func(pContext, dwSize); #define END_IO_MSG_MAP() \
return bRet; \
}谁能给详细的讲讲这段代码啊???这个宏定义,只要调用ProcessIOMessage,都会触发吗?

解决方案 »

  1.   

    BEGIN_IO_MSG_MAP()
    IO_MESSAGE_HANDLER(msg, func)
    END_IO_MSG_MAP()
    三个宏组合起来,成为一个函数定义。
    基本上是这样用的:
    BEGIN_IO_MSG_MAP()
      IO_MESSAGE_HANDLER(WM_MSG1, OnMsg1)
      IO_MESSAGE_HANDLER(WM_MSG2, OnMsg2)
      IO_MESSAGE_HANDLER(WM_MSG3, OnMsg3)
      ....
    END_IO_MSG_MAP()
      

  2.   

    调用的时候这样:
    BEGIN_IO_MSG_MAP()
    IO_MESSAGE_HANDLER(msg, func) 
    END_IO_MSG_MAP() 
    展开后就是:public:
    bool ProcessIOMessage(IOType clientIO, ClientContext* pContext, DWORD dwSize = 0) \
            { 
                bool bRet = false; 
                if (msg == clientIO) \
                    bRet = func(pContext, dwSize); 
            return bRet; 
        }也就是一个函数,IO_MESSAGE_HANDLER()用来添加消息响应函数来处理消息。   
      

  3.   

    不是调用会触发,而是把这些宏转化成定义的代码写到程序里。
    BEGIN_IO_MSG_MAP()和END_IO_MSG_MAP()要成对出现,因为只出现一个的话构不成完整代码,IO_MESSAGE_HANDLER(msg, func)要出现在这两个中间。例如
    BEGIN_IO_MSG_MAP()
    IO_MESSAGE_HANDLER(ID_MY_MSG, OnMyMsg)
    END_IO_MSG_MAP()被解释成下面的代码替换这段代码
    public: 
            bool ProcessIOMessage(IOType clientIO, ClientContext* pContext, DWORD dwSize = 0) \
            { 
                bool bRet = false;             if (ID_MY_MSG == clientIO)
                    bRet = OnMyMsg(pContext, dwSize);         return bRet;
        }从代码结果来看,显然这些宏应该用在类的定义部分。
      

  4.   

    就是 
    BEGIN_IO_MSG_MAP()  代表 
    public: 
            bool ProcessIOMessage(IOType clientIO, ClientContext* pContext, DWORD dwSize = 0) 
            { 
                bool bRet = false; IO_MESSAGE_HANDLER(msg, func) 代表 
                if (msg == clientIO) 
                    bRet = func(pContext, dwSize); END_IO_MSG_MAP() 代表 
            return bRet; 
        }三个宏就是一个函数的定义
      

  5.   

    可是,函数的参数:IOType clientIO, ClientContext* pContext, DWORD dwSize = 0
    是如何传递给宏的?
      

  6.   

    如果类的定义(.h)时这么出现,就相当于一个inline函数了?
      

  7.   

    ProcessIOMessage是虚函数,由基类调用子类。当有io消息时,先调用父类的ProcessIOMessage函数,
    然后IOType clientIO, ClientContext* pContext, DWORD dwSize这些参数就有了
      

  8.   

    1、当然是调用这个函数的人传的了
    2、不是inline函数
    #define BEGIN_IO_MSG_MAP() \
    public: \
            inline bool ProcessIOMessage(IOType clientIO, ClientContext* pContext, DWORD dwSize = 0) \
            { \
                bool bRet = false;
    这样才是inline函数而且你理解的还有问题,不是说参数如何传递给宏,宏只是写代码的时候的一种写法,在执行上不存在参数传递给宏这一说,你的意思应该是参数如何传递给ProcessIOMessage这个函数,那当然谁调用谁传了,系统会调用,你自己也可以调用
      

  9.   

    在类的头文件中,宏展开以后,不就是inline么,呵呵
      

  10.   

    别走,哥们,最后一个问题,类声明后,__declspec(novtable)加上这个,调用时有什么好处呢?就是减少虚函数表的容量?
      

  11.   

    novtable就是说不产生虚函数表。
    一般的如果能肯定这个类不是继承关系中的最低层的话可以这么用,也算是强制这个类必须被继承。
    在COM中定义的对象,经常加上这个限制。