我必须开发一个能够破解动态消息列表的功能
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'
答案 0 :(得分:3)
问题在于MsgTypes.hpp
中的每一行之后都有一个分号,因此您的宏将在其后扩展为一个分号,例如:
if (false) {}
else if (...)
{ ... }; // <- !!!
else if (...)
{ ... };
不用说,这会导致出现您所看到的确切的编译器错误-else
前不应有分号。
尽管可以避免使用宏,但可以这样知道。 C ++还有其他工具(例如模板,多态性)以人类可以直接理解的方式解决此确切问题。很难找到这个简单的问题,这正是宏导致错误的原因之一。如果您在一个新问题中描述了您真正想做的事情,那么人们会很乐意为您提供选择。