以前我问了一个问题并得到了公正的回应.但我坚持下面的宏定义.
以下定义生成消息映射函数,就像它在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); \
} \
};
Run Code Online (Sandbox Code Playgroud)
这里,例如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:语法错误:'}'