宏停止在Linux上编译

时间:2013-02-25 18:08:12

标签: c++ macros g++ xlc

我有一个包含多个宏的库,它在AIX上编译很好,但现在我需要编译相同的代码,似乎宏停止工作。 我一直收到消息:

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

有没有办法让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. 

2 个答案:

答案 0 :(得分: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扩展为。

答案 1 :(得分: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];