简体   繁体   English

字符串文字到 char 数组文字

[英]String literal to char array literal

I am writing some code which involves writing char arrays like so:我正在编写一些涉及编写 char arrays 的代码,如下所示:

char arr[] = { CONST1, CONST2, 'h', 'e', 'l', 'l', 'o' };

( CONST1 and CONST2 are enum values) Is there any way I can express this string of char literals, as a single string literal (via preprocessor macros or otherwise)? CONST1CONST2是枚举值)有什么方法可以将这个字符字符串表示为单个字符串文字(通过预处理器宏或其他方式)? eg例如

char arr = {CONST1, CONST2, "hello"};

Wrapping it in either single and double quotes produce compiler errors as expected.用单引号和双引号括起来会产生预期的编译器错误。

Here's your macro, use it wisely:这是您的宏,请明智地使用它:

#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 = '\0';
    
#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

Usage:用法:

enum E {e1, e2};

int main()
{
    MAKE_ARRAY(foo, ENUM e1 ENUM e2 STR "abc")
}

This expands to:这扩展为:

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 = '\0';

Here:这里:

  • _MAKE_ARRAY_ptr_42 is a helper pointer. _MAKE_ARRAY_ptr_42是一个辅助指针。 The number at the end comes from __LINE__ , so you can't use two MAKE_ARRAY s at a single line.末尾的数字来自__LINE__ ,因此您不能在一行中使用两个MAKE_ARRAY Replace it with a global variable if you want to.如果需要,将其替换为全局变量。
  • In char foo[1 +1 +1 +sizeof("abc")-1];char foo[1 +1 +1 +sizeof("abc")-1]; :
    • 1 at the beginning is always there to make room for the null-terminator.开头的1总是为空终止符腾出空间。
    • Two +1 s come from ENUM <name> .两个+1来自ENUM <name>
    • +sizeof("abc")-1 comes from STR "abc" . +sizeof("abc")-1来自STR "abc"
  • *_MAKE_ARRAY_ptr_42 = '\0'; at the end adds a null-terminator.最后添加一个空终止符。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM