字符串文字到 char 数组文字
String literal to char array literal
我正在编写一些代码,其中涉及编写 char 数组,如下所示:
char arr[] = { CONST1, CONST2, 'h', 'e', 'l', 'l', 'o' };
(CONST1
和 CONST2
是枚举值)
有什么方法可以将这串 char 文字表示为单个字符串文字(通过预处理器宏或其他方式)?例如
char arr = {CONST1, CONST2, "hello"};
用单引号和双引号将其括起来会产生预期的编译器错误。
这是你的宏,明智地使用它:
#define ENUM )(enum,
#define STR )(str,
#define MAKE_ARRAY(name, seq) \
char name[END( MAKE_ARRAY_SIZEOF_LOOP_A(start, seq) )]; \
char *MAKE_ARRAY_ptr = name; \
END( MAKE_ARRAY_WRITE_LOOP_A(start, seq) ) \
*MAKE_ARRAY_ptr = '[=10=]';
#define CAT(x,y) CAT_(x,y)
#define CAT_(x,y) x##y
#define END(...) END_(__VA_ARGS__)
#define END_(...) __VA_ARGS__##_END
#define MAKE_ARRAY_ptr CAT(_MAKE_ARRAY_ptr_,__LINE__)
#define MAKE_ARRAY_SIZEOF_start(x) 1
#define MAKE_ARRAY_SIZEOF_enum(x) +1
#define MAKE_ARRAY_SIZEOF_str(x) +sizeof(x)-1
#define MAKE_ARRAY_SIZEOF_LOOP_BODY(x,y) CAT(MAKE_ARRAY_SIZEOF_,x)(y)
#define MAKE_ARRAY_SIZEOF_LOOP_A(...) MAKE_ARRAY_SIZEOF_LOOP_BODY(__VA_ARGS__) MAKE_ARRAY_SIZEOF_LOOP_B
#define MAKE_ARRAY_SIZEOF_LOOP_B(...) MAKE_ARRAY_SIZEOF_LOOP_BODY(__VA_ARGS__) MAKE_ARRAY_SIZEOF_LOOP_A
#define MAKE_ARRAY_SIZEOF_LOOP_A_END
#define MAKE_ARRAY_SIZEOF_LOOP_B_END
#define MAKE_ARRAY_WRITE_start(x)
#define MAKE_ARRAY_WRITE_enum(x) *MAKE_ARRAY_ptr++ = (char)x;
#define MAKE_ARRAY_WRITE_str(x) for (size_t i = 0; i < sizeof(x)-1; i++) *MAKE_ARRAY_ptr++ = x[i];
#define MAKE_ARRAY_WRITE_LOOP_BODY(x,y) CAT(MAKE_ARRAY_WRITE_,x)(y)
#define MAKE_ARRAY_WRITE_LOOP_A(...) MAKE_ARRAY_WRITE_LOOP_BODY(__VA_ARGS__) MAKE_ARRAY_WRITE_LOOP_B
#define MAKE_ARRAY_WRITE_LOOP_B(...) MAKE_ARRAY_WRITE_LOOP_BODY(__VA_ARGS__) MAKE_ARRAY_WRITE_LOOP_A
#define MAKE_ARRAY_WRITE_LOOP_A_END
#define MAKE_ARRAY_WRITE_LOOP_B_END
用法:
enum E {e1, e2};
int main()
{
MAKE_ARRAY(foo, ENUM e1 ENUM e2 STR "abc")
}
扩展为:
char foo[1 +1 +1 +sizeof("abc")-1];
char *_MAKE_ARRAY_ptr_42 = foo;
*_MAKE_ARRAY_ptr_42++ = (char)e1;
*_MAKE_ARRAY_ptr_42++ = (char)e2;
for (size_t i = 0; i < sizeof("abc")-1; i++)
*_MAKE_ARRAY_ptr_42++ = "abc"[i];
*_MAKE_ARRAY_ptr_42 = '[=12=]';
这里:
_MAKE_ARRAY_ptr_42
是辅助指针。末尾的数字来自 __LINE__
,因此您不能在一行中使用两个 MAKE_ARRAY
。如果需要,请将其替换为全局变量。
- 在
char foo[1 +1 +1 +sizeof("abc")-1];
中:
1
开头总是为空终止符腾出空间。
- 两个
+1
来自ENUM <name>
。
+sizeof("abc")-1
来自 STR "abc"
.
*_MAKE_ARRAY_ptr_42 = '[=22=]';
最后添加一个空终止符。
我正在编写一些代码,其中涉及编写 char 数组,如下所示:
char arr[] = { CONST1, CONST2, 'h', 'e', 'l', 'l', 'o' };
(CONST1
和 CONST2
是枚举值)
有什么方法可以将这串 char 文字表示为单个字符串文字(通过预处理器宏或其他方式)?例如
char arr = {CONST1, CONST2, "hello"};
用单引号和双引号将其括起来会产生预期的编译器错误。
这是你的宏,明智地使用它:
#define ENUM )(enum,
#define STR )(str,
#define MAKE_ARRAY(name, seq) \
char name[END( MAKE_ARRAY_SIZEOF_LOOP_A(start, seq) )]; \
char *MAKE_ARRAY_ptr = name; \
END( MAKE_ARRAY_WRITE_LOOP_A(start, seq) ) \
*MAKE_ARRAY_ptr = '[=10=]';
#define CAT(x,y) CAT_(x,y)
#define CAT_(x,y) x##y
#define END(...) END_(__VA_ARGS__)
#define END_(...) __VA_ARGS__##_END
#define MAKE_ARRAY_ptr CAT(_MAKE_ARRAY_ptr_,__LINE__)
#define MAKE_ARRAY_SIZEOF_start(x) 1
#define MAKE_ARRAY_SIZEOF_enum(x) +1
#define MAKE_ARRAY_SIZEOF_str(x) +sizeof(x)-1
#define MAKE_ARRAY_SIZEOF_LOOP_BODY(x,y) CAT(MAKE_ARRAY_SIZEOF_,x)(y)
#define MAKE_ARRAY_SIZEOF_LOOP_A(...) MAKE_ARRAY_SIZEOF_LOOP_BODY(__VA_ARGS__) MAKE_ARRAY_SIZEOF_LOOP_B
#define MAKE_ARRAY_SIZEOF_LOOP_B(...) MAKE_ARRAY_SIZEOF_LOOP_BODY(__VA_ARGS__) MAKE_ARRAY_SIZEOF_LOOP_A
#define MAKE_ARRAY_SIZEOF_LOOP_A_END
#define MAKE_ARRAY_SIZEOF_LOOP_B_END
#define MAKE_ARRAY_WRITE_start(x)
#define MAKE_ARRAY_WRITE_enum(x) *MAKE_ARRAY_ptr++ = (char)x;
#define MAKE_ARRAY_WRITE_str(x) for (size_t i = 0; i < sizeof(x)-1; i++) *MAKE_ARRAY_ptr++ = x[i];
#define MAKE_ARRAY_WRITE_LOOP_BODY(x,y) CAT(MAKE_ARRAY_WRITE_,x)(y)
#define MAKE_ARRAY_WRITE_LOOP_A(...) MAKE_ARRAY_WRITE_LOOP_BODY(__VA_ARGS__) MAKE_ARRAY_WRITE_LOOP_B
#define MAKE_ARRAY_WRITE_LOOP_B(...) MAKE_ARRAY_WRITE_LOOP_BODY(__VA_ARGS__) MAKE_ARRAY_WRITE_LOOP_A
#define MAKE_ARRAY_WRITE_LOOP_A_END
#define MAKE_ARRAY_WRITE_LOOP_B_END
用法:
enum E {e1, e2};
int main()
{
MAKE_ARRAY(foo, ENUM e1 ENUM e2 STR "abc")
}
扩展为:
char foo[1 +1 +1 +sizeof("abc")-1];
char *_MAKE_ARRAY_ptr_42 = foo;
*_MAKE_ARRAY_ptr_42++ = (char)e1;
*_MAKE_ARRAY_ptr_42++ = (char)e2;
for (size_t i = 0; i < sizeof("abc")-1; i++)
*_MAKE_ARRAY_ptr_42++ = "abc"[i];
*_MAKE_ARRAY_ptr_42 = '[=12=]';
这里:
_MAKE_ARRAY_ptr_42
是辅助指针。末尾的数字来自__LINE__
,因此您不能在一行中使用两个MAKE_ARRAY
。如果需要,请将其替换为全局变量。- 在
char foo[1 +1 +1 +sizeof("abc")-1];
中:1
开头总是为空终止符腾出空间。- 两个
+1
来自ENUM <name>
。 +sizeof("abc")-1
来自STR "abc"
.
*_MAKE_ARRAY_ptr_42 = '[=22=]';
最后添加一个空终止符。