генерировать последовательность 'if ... else if ... else if ... else' со списком макросов с #inclusion из файла - PullRequest
0 голосов
/ 29 ноября 2018

Мне нужно разработать функцию, которая взламывает динамический список сообщений

MsgCracker.hpp

void MsgCracker<TCaller>::crackMessage(const FIX44::Message& message, const FIX::SessionID& session_id)
{
     FIX::MsgType msgType;
     message.getHeader().getField( msgType );

     #define DECLARE_MSG_TYPE(MSG_NAME, MSG_TYPE)     \
       else if(msgType==MSG_TYPE)                     \
       {                                              \
             m_Caller.onMessage( (const FIX44::MSG_NAME&)message, session_id,timestamp );                \
        }

    if(false){}                                                                                                                         
    #include "MsgTypes.hpp"
    #undef DECLARE_MSG_TYPE
    else
    {
          FIX44::MessageCracker::crack(message, session_id);
    }
}

MsgTypes.hpp

DECLARE_MSG_TYPE (TradeCaptureReport  , FIX::MsgType_TradeCaptureReport);
DECLARE_MSG_TYPE (SecurityList , FIX::MsgType_SecurityList);

Но яошибка компиляции: error: 'else' без предыдущего 'if'

1 Ответ

0 голосов
/ 29 ноября 2018

Проблема в том, что у вас есть точка с запятой после каждой строки в MsgTypes.hpp, поэтому ваши макросы расширяются точкой с запятой после них, например:

if (false) {}
else if (...)
  { ... }; // <- !!!
else if (...)
  { ... };

Само собой разумеется, это приводит кточную ошибку компилятора, которую вы видите - перед else.

не должно быть точки с запятой. Пусть будет известно, что вам следует избегать макросов для этого.C ++ имеет другие инструменты (например, шаблоны, полиморфизм), чтобы решить эту проблему так, чтобы люди могли ее понять.Трудность в поиске этой простой проблемы - как раз одна из причин, по которой макросы сосут.Если вы опишите, что вы действительно хотите сделать в новом вопросе, люди будут рады предложить вам варианты.

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