将常量转换为十六进制字符串的C/ c++宏函数

C/C++ macro function that converts a constant to a hex string

本文关键字:c++ 函数 字符串 常量 转换 十六进制      更新时间:2023-10-16

所以我需要/想要一个C/c++宏函数,它需要一个#define常量并将其转换为十六进制字符串。我知道#是这样做的,但不是我想要的。

下面是我现在的基本内容:
#define SHIFT 2
#define CONSTANT 0x00000001 << SHIFT
#define _MAKE_HEX(value) #value
#define MAKE_HEX(value) _MAKE_HEX(value)
const char* String = MAKE_HEX(CONSTANT);

结果不是最终值,它只是显示文本替换的结果。我该如何解决这个问题?

嗯…如果您可以将SHIFT定义为实际需要的零,而不是它们的数量,那么您可以这样做:

#define SHIFT 00
#define ONE 0x1
#define _MAKECONSTANT(value, shift) value ## shift
#define MAKECONSTANT(value, shift) _MAKECONSTANT(value, shift)
#define CONSTANT MAKECONSTANT(ONE, SHIFT)
#define _MAKE_HEX(value) #value
#define MAKE_HEX(value) _MAKE_HEX(value)
const char* String = MAKE_HEX(CONSTANT);
int value = CONSTANT;

字符串以"0x100"结束,整数作为预期值。

在c++ 14中,可以这样做

template <std::size_t N>
constexpr char bin_string[] = {'0', 'b',
    ((N >> 7) & 1) ? '1' : '0',
    ((N >> 6) & 1) ? '1' : '0',
    ((N >> 5) & 1) ? '1' : '0',
    ((N >> 4) & 1) ? '1' : '0',
    ((N >> 3) & 1) ? '1' : '0',
    ((N >> 2) & 1) ? '1' : '0',
    ((N >> 1) & 1) ? '1' : '0',
    ((N >> 0) & 1) ? '1' : '0',
    ''
}; 
template <std::size_t N>
constexpr char hex_string[] = {'0', 'x',
    "0123456789ABCDEF"[(N >> 8u) & 0x0F],
    "0123456789ABCDEF"[(N >> 0u) & 0x0F],
    ''
}; 

现场演示