宏已停止在Linux上编译

Macro stopped to compile on Linux

本文关键字:Linux 编译      更新时间:2023-10-16

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

我认为您不想在这里使用##

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

您想在宏中做什么?看起来第一个令牌粘贴是多余的:

#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];