Макрос перестал компилироваться в 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.

0

Решение

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

#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 расширяется до.

2

Другие решения

Что вы пытаетесь сделать в макросе? Похоже, что первая вставка токена избыточна:

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

По вопросам рекламы [email protected]