0

我有一个包含多个宏的库,它在 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. 
4

2 回答 2

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扩展任何内容即可。

于 2013-02-25T18:14:49.307 回答
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];
于 2013-02-25T18:16:21.067 回答