生成带有#include文件的宏列表的'if ... else if ... else if ... else'序列

时间:2018-11-29 10:47:45

标签: c++ macros

我必须开发一个能够破解动态消息列表的功能

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);

但是我遇到了编译错误:错误:'else',而之前没有'if'

1 个答案:

答案 0 :(得分:3)

问题在于MsgTypes.hpp中的每一行之后都有一个分号,因此您的宏将在其后扩展为一个分号,例如:

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

不用说,这会导致出现您所看到的确切的编译器错误-else前不应有分号。

尽管可以避免使用宏,但可以这样知道。 C ++还有其他工具(例如模板,多态性)以人类可以直接理解的方式解决此确切问题。很难找到这个简单的问题,这正是宏导致错误的原因之一。如果您在一个新问题中描述了您真正想做的事情,那么人们会很乐意为您提供选择。