Неправильное использование макроса в макросе в Eclipse - PullRequest
0 голосов
/ 21 февраля 2019

Здравствуйте, у меня есть следующая проблема:

  • IDE: Eclipse Версия: 2018-12 (4.10.0) с плагином Keil C51 (для сопоставления языков)
  • Компилятор (external): Wickenhäuser uc51

Проблема здесь: Плохая последовательность символов Eclipse

Отображение языка Keil использует этот синтаксис:

xdata unsigned char Port = 0x1;

Wickenhäuser немного отличается:

xdata unsigned char Port @ 0x1;

Итак, я пришел к этому рабочему решению:

#ifdef __CDT_PARSER__
    xdata unsigned char Port = 0x1;
#else
    //xdata unsigned char Port @ 0x1; //BAD Character Squence encountered: @
    #define AT_ADDRESS(n) @##n //Using this Macro to get around this problem
    xdata unsigned char Port_B AT_ADDRESS(0x1);
#endif

Но это решение не идеально, (удваивает запись и т. Д.) И должно выглядеть так:

#ifdef __CDT_PARSER__ //In Keil I have to define this too, to make use the Keil syntax
    //#define AT_ADDRESS(n) // This works
    #define AT_ADDRESS(n) =##n // Gives error
#else
    #define AT_ADDRESS(n) @##n
#endif

xdata unsigned char Port_B AT_ADDRESS(0x1); // GIVES ERROR: Invalid use of macro pasting in macro AT_ADDRESS

К сожалению, Eclipse помечает это так: недопустимое использование макроса, вставляемого в макрос AT_ADDRESS

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Теперь я создаю это улучшенное (с советами выше) рабочее решение.

#ifndef COMPILER_COMPAT_H_
#define COMPILER_COMPAT_H_

#define COMPILER_COMPAT_WICKEN // Comment out for use project in Keil


#ifdef __CDT_PARSER__
#   undef COMPILER_COMPAT_WICKEN
#endif

#ifndef COMPILER_COMPAT_WICKEN
#   ifndef BIT_ADDRESS
#       define BIT_ADDRESS(n) = n
#   endif
#else
#   ifndef BIT_ADDRESS
#       define BIT_ADDRESS(n) @ n
#   endif
#endif


#endif /* COMPILER_COMPAT_H_ */
0 голосов
/ 21 февраля 2019

Вам не нужно вставлять в этот момент.Просто замените

#define AT_ADDRESS(n) =##n

на

#define AT_ADDRESS(n) = n

то же самое относится и к расширенной версии C, в обоих показанных вами «расширенных» примерах между символом адреса и фактическим символом вставляется пробел.адрес так:

#ifdef __CDT_PARSER__ //In Keil I have to define this too, to make use the Keil syntax
    #define AT_ADDRESS(n) = n
#else
    #define AT_ADDRESS(n) @ n
#endif
...