消息映射的宏定义

时间:2009-12-15 09:33:57

标签: c++ macros

以前我asked a question得到了公正的回应。但我坚持下面的宏定义。

以下定义生成一个消息映射函数,就像它在MFC消息映射中一样。但是下面的代码不能编译。

this->开头的整个陈述是有问题的,除了MSG_HANDLER this->meth(msg);中的那个不知道为什么......

那么可以采取哪些措施来纠正这个问题呢?

我使用VS 2008。

#define MSG_UNPACK(var, id, msg) x##id *var = (x##id *)(msg);

#define BEGIN_MSG_MAP                          \
   protected:                                  \
   virtual void dispatchToMsgMap(xMessage *msg)\
   {                                           \
     if (msg->msg.message == WM_NULL)          \
     {                                         \
       return;                                 \
     }

#define MSG_HANDLER(meth, wm_msg)              \
     else if (msg->msg.message == wm_msg)      \
     {                                         \
       this->meth(msg);                        \
       return;                                 \
     }

#define END_MSG_MAP(base)                      \
     else if (msg->msg.message == WM_COMMAND)  \
     {                                         \                       
       this->dispatchToCmdMap(msg);            \                       
       return;                                 \                       
     }                                         \                       
     else if (msg->msg.message == WM_NOTIFY)   \                       
     {                                         \                       
       this->dispatchToNotifyMap(msg);         \                       
       return;                                 \                       
     }                                         \                       
                                               \                       
     base::dispatchToMsgMap(msg);              \                       
   };

#define BEGIN_CMD_MAP                          \
   virtual void dispatchToCmdMap(xMessage *msg)\
   {                                           \                              
     MSG_UNPACK(Cmd, WM_COMMAND, msg);         \                              
                                               \                              
     if (Cmd->ItemID == 0)                     \                              
     {                                         \                              
        /* not allowed */                      \                              
     }                                                                        

#define CMD_HANDLER(meth, cmd_id)              \
     else if (Cmd->ItemID == cmd_id)           \
     {                                         \                                
       this->meth(Cmd->ItemID);                \                                
     }                                                                          

#define END_CMD_MAP(base)                      \
     else                                      \                              
     {                                         \                              
       base::dispatchToCmdMap(msg);        \                              
     }                                         \                              
   };

此处,例如this->dispatchToCmdMap(msg); \是第41行。

1> d:\ devel \ coding \ vs2008 \ test2 \ test2 \ messagemapper.h(41):错误C2059:语法错误:'this' 1> d:\ devel \ coding \ vs2008 \ test2 \ test2 \ messagemapper.h(41):错误C2017:非法转义序列 1> d:\ devel \ coding \ vs2008 \ test2 \ test2 \ messagemapper.h(42):错误C2059:语法错误:'return' 1> d:\ devel \ coding \ vs2008 \ test2 \ test2 \ messagemapper.h(42):错误C2017:非法转义序列 1> d:\ devel \ coding \ vs2008 \ test2 \ test2 \ messagemapper.h(43):错误C2059:语法错误:'}' 1> d:\ devel \ coding \ vs2008 \ test2 \ test2 \ messagemapper.h(43):错误C2143:语法错误:缺少';'之前'}' 1> d:\ devel \ coding \ vs2008 \ test2 \ test2 \ messagemapper.h(43):错误C2059:语法错误:'}'

3 个答案:

答案 0 :(得分:5)

“非法转义序列”部分告诉我,\后面有空格。因此,下一行不是宏的一部分。

答案 1 :(得分:1)

首先,检查行末尾的斜杠后面是否有空格。

如果这没有用,那么您应该查看预处理的输出以查看实际编译的内容(如果需要,可以在此处发布)。

答案 2 :(得分:1)

尝试删除“\”后面的空格。该符号应该是该行中的最后一个。