Определение макроса для отображения сообщений - PullRequest
0 голосов
/ 15 декабря 2009

Раньше я задавал вопрос и получил честный ответ. Но я застрял с определениями макросов ниже.

Приведенные ниже определения генерируют функцию карты сообщений, как в карте сообщений 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: синтаксическая ошибка: '}'

Ответы [ 3 ]

5 голосов
/ 15 декабря 2009

Часть "Недопустимая escape-последовательность" говорит мне, что у вас есть пробельные символы после вашего \. Поэтому следующие строки не являются частью макроса.

1 голос
/ 15 декабря 2009

Попробуйте убрать пробелы после "\". Этот символ должен быть последним в строке.

1 голос
/ 15 декабря 2009

Сначала убедитесь, что после косой черты в конце строк у вас нет пробелов.

Если это не поможет, то вы должны посмотреть на предварительно обработанный вывод, чтобы увидеть, что на самом деле компилируется (и опубликовать это здесь, если вам нужно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...