我正在尝试让宏在我的 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 编译器上*
关于c++ - 定义一个宏以将前缀 0x 添加到十六进制字符串文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59828811/