Используйте строковый оператор #
для преобразования токенов в строки. Однако, поскольку оператор строкового преобразования может быть применен только к параметрам макроса, необходимо добавить несколько дополнительных слоев макросов:
#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");
.