字符串中的GCC宏扩展参数

时间:2011-07-13 22:58:10

标签: c gcc macros

我有这样的情况

#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 个答案:

答案 0 :(得分:9)

#define S(x) #x
#define SX(x) S(x)

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

请在此处查看详细信息:C Preprocessor, Stringify the result of a macro

答案 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;
  }