Макрос перестал компилироваться в Linux

У меня есть библиотека с несколькими макросами, она отлично компилируется в AIX, но теперь мне нужно скомпилировать тот же код, и кажется, что макросы перестали работать. Я продолжаю получать сообщение:

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

Есть ли способ заставить препроцессор C++ на linux действовать как на aix. Я использую g ++ в Linux и xlc_r в AIX.

Вот один из макросов.

#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 ответа

Решение

Я думаю, что вы не хотите использовать ## Вот:

#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];
Другие вопросы по тегам