2009-12-15 101 views
0

以前I asked a question并得到了公平的回应。但是我被下面的宏定义所困扰。消息映射的宏定义

以下定义生成一个消息映射函数,就像它在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):error C2059:syntax error:'this' 1> d:\ devel \ coding \ vs2008 \ test2 \ test2 \ messagemapper.h(41):错误C2017:非法转义序列 1> d:\ devel \ coding \ vs2008 \ test2 \ test2 \ messagemapper.h(42):错误C2059:语法错误:'return' 1> d :\ devel \ coding \ vs2008 \ test2 \ test2 \ messagemapper.h(42):error C2017:非法转义序列 1> d:\ devel \ coding \ vs2008 \ test2 \ test2 \ messagemapper.h(43):error C2059 :语法错误:'}' 1> d:\ devel \ coding \ vs2008 \ test2 \ test2 \ messagemapper.h(43):错误C2143:语法错误:缺少';' '}' 1> d:\ devel \ coding \ vs2008 \ test2 \ test2 \ messagemapper.h(43):error C2059:syntax error:'}'

+0

什么是错误信息? – Timbo 2009-12-15 09:39:02

+0

函数不应以“;”结尾。你是否尝试过没有“;”?它阻止我进一步调查。这可能是因为它阻止了dispatchToCmdMap的定义,所以无法访问它。 – stefaanv 2009-12-15 09:47:02

+0

@stefaanv;尝试但没有成功 @Timbo;添加错误消息 – whoi 2009-12-15 09:49:38

回答

5

“非法转义序列”部分告诉我,您在\之后拖动了空格。因此下一行不是宏的一部分。

+0

你是最好的人! – whoi 2009-12-15 10:10:09

1

首先,检查你没有空白在行结尾处的斜线之后。

如果这没有帮助,那么你应该看看预处理输出,看看实际编译的是什么(如果需要,可以在这里发布)。

1

尝试删除“\”后面的空格。这个符号应该是行中的最后一个。