Раньше я задавал вопрос и получил честный ответ. Но я застрял с определениями макросов ниже.
Приведенные ниже определения генерируют функцию карты сообщений, как в карте сообщений 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: недопустимая escape-последовательность
1> d: \ devel \ coding \ vs2008 \ test2 \ test2 \ messagemapper.h (42): ошибка C2059: синтаксическая ошибка: «возврат»
1> d: \ devel \ coding \ vs2008 \ test2 \ test2 \ messagemapper.h (42): ошибка C2017: недопустимая escape-последовательность
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: синтаксическая ошибка: '}'