定义一个宏以将前缀0x添加到十六进制字符串文字中

问题描述 投票:2回答:1

我正在尝试使宏在我的c程序中工作,以将0x添加到十六进制文字,如下所示:

#define BUILD ABCD0000

#define CONCAT(m, n) m ## n
#define HEX(x) CONCAT(0x, x)

const uint32_t Id = HEX (BUILD);

我收到此编译器错误:整数常量后缀“ x”无效。谁能帮忙?

c++ hex preprocessor
1个回答
1
投票

这不是您期望的答案,但是很抱歉,我必须:不要这样做!

为什么不呢?

  • 这具有误导性:名称和语法HEX(x)导致认为将x转换为十六进制,而它要求参数已经在十六进制中。
  • 表现不佳:HEX(ABC00+10)会将第一部分带为十六进制,但第二部分仍为十进制。为了使宏在表达式中表现良好,诀窍是将每次使用参数括在括号之间,但是使用串联是不可能的。
  • 与您的同级开发人员相抵触POLA
  • 更好地习惯0x:它出现在附近的许多代码中,编译器消息中,调试器中等...因此,请训练自己的眼睛,而不要尝试逃脱。

据说,在Godbolt上测试了几个编译器版本后,我无法重现您的错误。因此,如果您想继续:

  • 也许您的旧编译器会因空格而干扰(删除宏定义和宏使用中的所有空格)。还是不应该,但是谁知道,宏中的两个x要扩展?
  • 或者也许您的编译器希望宏中使用的每个令牌都有效(例如,字符串必须关闭,字面量有效,等等。)。我记得有这样的限制,但在80年代(也许是90年代)的非常老的C编译器上*
© www.soinside.com 2019 - 2024. All rights reserved.