2013-02-25 79 views
0

我有一個包含多個宏的庫,它在AIX上編譯得很好,但現在我需要編譯相同的代碼,看起來宏停止工作。 我不斷收到的消息:宏在Linux上停止編譯

​​

有沒有一種方法,使在Linux上的行爲C++預處理器就像在AIX上。 我在linux上使用g ++,在AIX上使用xlc_r。

這是一個宏。

#define E_TRA_INMOD(MName, Comp) \ 
    static const ES_TracMg::ES_TracComps ES_TracComp = \ 
            ES_TracMg::##Comp; \ 
    static char* ES_Mod_Namp = MName; \ 
    static unsigned long ES_SerMas = \ 
       ES_TracMg::m_MServ[ES_TracMg##Comp]; 

我這樣稱呼它E_TRA_INMOD("Error", EVENT_DATA);
的錯誤是:

error: pasting "::" and "EVENT_DATA" does not give a valid preprocessing token. 
+0

什麼是錯誤信息?或者你得到了什麼,你不喜歡? – 2013-02-25 18:10:05

+0

錯誤消息是:錯誤:粘貼「::」和「EVENT_DATA」不提供有效的預處理令牌。 – Lefsler 2013-02-25 18:10:38

+0

您可以使用'cpp'程序在預處理後查看您的源代碼 – ShPavel 2013-02-25 18:16:39

回答

2

我想你不想在這裏使用##

#define E_TRA_INMOD(MName, Comp) \ 
    static const ES_TracMg::ES_TracComps ES_TracComp = \ 
            ES_TracMg::##Comp; \ 

應該

#define E_TRA_INMOD(MName, Comp) \ 
    static const ES_TracMg::ES_TracComps ES_TracComp = \ 
            ES_TracMg::Comp; \ 

您沒有兩個令牌可以粘在一起成爲一個令牌,您只需將任何Comp擴展到。

0

你想在宏中做什麼?它看起來像第一個令牌粘貼是多餘的:

#define E_TRA_INMOD(MName,Comp) \ 
    static const ES_TracMg::ES_TracComps ES_TracComp = \ 
            ES_TracMg::Comp; \ 
    static char* ES_Mod_Namp = MName; \ 
    static unsigned long ES_SerMas = \ 
       ES_TracMg::m_MServ[ES_TracMg##Comp];