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

标签 c++ hex preprocessor

我正在尝试让宏在我的 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/

相关文章:

macros - 如何为 iOS 和 macOS 编写通用的 Swift 代码。在 cocoa 中我可以使用#ifdef,我现在该怎么办?

machine-learning - 预处理已转换为数字的分类数据

c++ - 当通过 FFI 从 Rust 调用时,您如何使用返回 shared_ptr<T> 的 C++ 函数?

c++ - 将 boostaccumulator_set 存储在 STL 映射中

c++ - 在QFileSystemModel中找到第n个文件/文件夹

java - 如何从左移二进制和解释十六进制数字节数组?

javascript - 将小端十六进制字符串解析为十进制

c# - 将 int 转换为十六进制而不是字符串

c++ - 如何在现代 C++ 中实现没有宏的系统特定函数

c++ - 哪个地方初始化基类成员变量比较好?