以前I 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):error C2059:syntax error:'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):error C2017:非法轉義序列 1> d:\ devel \ coding \ vs2008 \ test2 \ test2 \ messagemapper.h(43):error C2059 :語法錯誤:'}' 1> d:\ devel \ coding \ vs2008 \ test2 \ test2 \ messagemapper.h(43):錯誤C2143:語法錯誤:缺少';' '}' 1> d:\ devel \ coding \ vs2008 \ test2 \ test2 \ messagemapper.h(43):error C2059:syntax error:'}'
什麼是錯誤信息? – Timbo 2009-12-15 09:39:02
函數不應以「;」結尾。你是否嘗試過沒有「;」?它阻止我進一步調查。這可能是因爲它阻止了dispatchToCmdMap的定義,所以無法訪問它。 – stefaanv 2009-12-15 09:47:02
@stefaanv;嘗試但沒有成功 @Timbo;添加錯誤消息 – whoi 2009-12-15 09:49:38