Макрос, остановленный, чтобы собрать на Linux

У меня есть библиотека с несколькими макросами, это собирает прекрасный на ЭКС-АН-ПРОВАНСЕ, но теперь я должен собрать тот же самый код, и это кажется макросом, остановленным, чтобы работать. Я продолжаю получать сообщение:

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

Есть ли способ сделать препроцессор C++ на действиях Linux как на Экс-ан-Провансе. Я использую g ++ на Linux и 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 ("Ошибка", EVENT_DATA);
Ошибка:

error: pasting "::" and "EVENT_DATA" does not give a valid preprocessing token. 
0
nl ja de
Сообщение об ошибке: ошибка: приклеивание "::" и "EVENT_DATA" не дает действительный символ предварительной обработки.
добавлено автор Lefsler, источник
Извините, у меня есть несколько сообщений об ошибках, таким образом, я скопировал один из них
добавлено автор Lefsler, источник
Каково сообщение об ошибке? Или что является им, вы добираетесь и вы don' t как?
добавлено автор David Rodríguez - dribeas, источник
Сообщение об ошибке, кажется, не касается использования, на которое вы указываете, где EVENT_DATA в вашем коде?
добавлено автор David Rodríguez - dribeas, источник
@user286215, не, если cpp отказывается предварительно обрабатывать его!
добавлено автор Jonathan Wakely, источник
можно использовать cpp программа, чтобы видеть источники после предварительной обработки
добавлено автор ShPavel, источник

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; \

У вас нет двух символов, чтобы склеить в единственный символ, у вас просто есть любой , Аккомпанемент расширяется до.

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
добавлено
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest