字符串中的GCC宏扩展参数

Jim*_*orn 6 c macros gcc

我有这种情况

#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;
}
Run Code Online (Sandbox Code Playgroud)

我有一个顶级宏扩展,但扩展包含更多的宏.这些没有扩大并导致一些问题.

我希望的行为是最终的扩张

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

这里内部宏已经扩展.我真的不确定我做错了什么.有什么建议?

Kar*_*ath 9

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

#define VIOTA(A0) asm(".byte " SX(PRE) ", " SX(A0))
Run Code Online (Sandbox Code Playgroud)

请在此处查看详细信息:C预处理器,对宏的结果进行字符串化

  • *叹息*点击链接. (2认同)

Bjo*_*rnD 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;
  }
Run Code Online (Sandbox Code Playgroud)