2009-12-15 86 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

嘗試刪除「\」後面的空格。這個符號應該是行中的最後一個。