我有这样的情况
#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”)
这里扩展了内部宏。我真的不确定我做错了什么。有什么建议吗?
答案 0 :(得分:9)
#define S(x) #x
#define SX(x) S(x)
#define VIOTA(A0) asm(".byte " SX(PRE) ", " SX(A0))
答案 1 :(得分:1)
使用字符串化运算符#
将标记转换为字符串。但是,由于字符串化运算符只能应用于宏参数,因此需要添加一些额外的宏层:
#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");
。
答案 2 :(得分:0)
您正在将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;
}