Аргументы расширения макроса GCC внутри строки - PullRequest
6 голосов
/ 14 июля 2011

У меня такая ситуация

#define PRE 0xF1

#define SR0 0B0000
#define SR1 0B0001
#define SR2 0B0010
#define SR3 0B0011

#define VIOTA(A0)  asm(".byte PRE, A0")

int main()
{
  VIOTA(SR1);
  return 0;
}

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

Мне нужно, чтобы конечное расширение было

asm (". Byte 0xF1, 0B0000")

Здесь внутренние макросы были расширены.Я действительно не уверен, что я делаю не так вообще.Любой совет?

Ответы [ 3 ]

9 голосов
/ 14 июля 2011
#define S(x) #x
#define SX(x) S(x)

#define VIOTA(A0) asm(".byte " SX(PRE) ", " SX(A0))

Подробнее см. Здесь: C Препроцессор, Stringify результат макроса

1 голос
/ 14 июля 2011

Используйте строковый оператор # для преобразования токенов в строки. Однако, поскольку оператор строкового преобразования может быть применен только к параметрам макроса, необходимо добавить несколько дополнительных слоев макросов:

#define PRE 0xF1

#define SR0 0B0000
#define SR1 0B0001
#define SR2 0B0010
#define SR3 0B0011

#define VIOTA(A0) VIOTA_HELPER1(PRE, A0)
#define VIOTA_HELPER1(PRE, A0) VIOTA_HELPER2(PRE, A0)
#define VIOTA_HELPER2(PRE, A0) asm(".byte" #PRE ", " #A0)

int main(void)
{
  VIOTA(SR1);
  return 0;
}

После предварительной обработки это расширяется до:

int main(void)
{
  asm(".byte " "0xF1" ", " "0B0001");
  return 0;
}

Строковые константы объединяются во время компиляции, поэтому это эквивалентно asm(".byte 0xF1, 0B0001");.

0 голосов
/ 14 июля 2011

Вы делаете PRE частью строки, которая передается asm (). Макросы в строках не раскрываются.

Мне кажется, это работает:

  #define PRE 0xF1

  #define SR0 0B0000
  #define SR1 0B0001
  #define SR2 0B0010
  #define SR3 0B0011

  #define str(s) #s
  #define VIOTA(PRE, A0)  asm( ".byte " str(PRE) ", " str(A0) )

  int main()
  {    
       VIOTA(PRE, SR1);
         return 0;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...