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



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

#define BUILD ABCD0000
#define CONCAT(m, n) m ## n
#define HEX(x) CONCAT(0x, x)
const uint32_t Id = HEX (BUILD);

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

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

为什么不呢?

  • 这是误导性的:名称和语法HEX(x)导致认为会将x转换为十六进制,而它要求参数已经是十六进制。
  • 它的行为很糟糕:HEX(ABC00+10)会采取第一部分有十六进制,但第二部分仍然是十进制。为了让宏在表达式中表现良好,诀窍是将参数的每次使用括在括号之间,但这在串联中是不可能的。
  • 它与同行开发人员的 POLA 背道而驰
  • 最好习惯0x:它出现在周围的许多代码中,编译器消息中,调试器等中......所以训练你的眼睛,而不是试图逃跑。

话虽如此,在 godbolt 上测试了几个编译器版本后,我无法重现您的错误。 所以如果你想继续:

  • 也许您的旧编译器受到间距的干扰(删除宏定义和宏使用中的所有空格(。或者,它不应该,但谁知道呢,这两个x在宏中扩展?
  • 或者,也许您的编译器希望宏中使用的每个标记都是有效的(例如,字符串必须闭合,文本有效等(。我记得有这样的限制,但在 80 年代,也许是 90 年代的非常旧的 C 编译器上*

这个问题现在已经解决了。我让它在另一个编译器上工作,然后意识到它实际上是在为 BUILD 值生成一个空白,即只是 #define BUILD

最新更新