我需要一种方法将枚举常量的数值作为单个字节放入字符串常量中(在编译时)。
enum
{
SPECIAL_CHAR = 230
};
const char *str = "hello" ENUM_TO_STR_BYTE(SPECIAL_CHAR) "world";
我希望内存中的结果字符串
str
看起来像这个字符串:"hello\xE6world"
。
如何编写宏
ENUM_TO_STR_BYTE
?
当然可以通过用单个字符初始化字符串来完成,但这对于较长的字符串来说非常不方便
const char str[] = { 'h', 'e', 'l', 'l', 'o', SPECIAL_CHAR, 'w', 'o', 'r', 'l', 'd', '\0' };
一个拼凑是:
#define MakeIt(A, B, C) ((const char *) &(struct { const char a[sizeof A - 1], b, c[sizeof C]; }){A, B, C})
const char *str = MakeIt("hello", SPECIAL_CHAR, "world");
使用
const char
访问结构符合 C 2018 6.5 7 中的别名规则,因为它们允许使用字符类型访问任何对象。 C 标准允许实现在结构成员之后插入填充,但没有实际的 C 实现在 char
成员或 char
数组之间插入填充。