不以 nul 结尾的常量字符串文字

vla*_*sch 3 c c++

是否有一些技巧可以定义没有尾随字符的常量字符串文字'\0'

#define ARRAY_LEN(array) (sizeof(array)/sizeof((array)[0]))

static const char c_seqence[] = "___----__--_-_";
Run Code Online (Sandbox Code Playgroud)

因此 usingARRAY_LEN(c_seqence)返回实际序列长度而不带'\0'? 不应产生运行时开销。{'_','_',...}显然,由于可读性更好,类似字符串的表示形式比字符数组初始化更受青睐。

C 解决方案是首选,但某些 C++ 解决方案也可能很有趣,只要它们不依赖于 c++11 功能。

Fil*_*ves 5

\n

是否有一些技巧可以定义没有 \n 尾随 \'\\0\' 字符的常量字符串文字?

\n
\n\n

在 C 中,如果将字符数组的大小指定为比字符串文字初始值设定项的大小小 1,则它不会有尾随空字符。你可以这样做:

\n\n
static const char c_seqence[ARRAY_LEN("___----__--_-_")-1] = "___----__--_-_";\n
Run Code Online (Sandbox Code Playgroud)\n\n

当然,为了避免在同一行中两次指示字符串文字,您可能需要定义一个宏来执行此操作:

\n\n
#define MAKE_STR_LITERAL(n, l) static const char n[ARRAY_LEN(l)-1] = l\n
Run Code Online (Sandbox Code Playgroud)\n\n

你可以这样使用它:

\n\n
MAKE_STR_LITERAL(c_seqence, "___----__--_-_");\n
Run Code Online (Sandbox Code Playgroud)\n\n

笔记

\n\n

如/sf/answers/304373191/中所述,此行为位于标准的第 6.7.8 节中(引用该答案):

\n\n
\n

\xc2\xa7 6.7.8p14

\n\n

字符类型数组可以由字符串文字初始化,可以选择用大括号括起来。字符串文字的连续字符(如果有空间或数组大小未知,则包括终止空字符)初始化数组的元素。

\n
\n\n

Note2:事实证明这是一个仅限 C 的东西。在 C++ 中它不会编译。这是为什么人们不应该同时使用 C 和 C++ 来标记问题的另一个很好的例子。

\n

  • @vlad_tepesch 嗯,这在 C 和 C++ 中是不同的。事实证明这是一个只有 C 语言的东西。C++ 编译器会给你这个错误。这是为什么不应使用 C 和 C++ 标记问题的好例子:) (4认同)
  • 对于创建不包含字符串且不是文字的数组的宏来说,“MAKE_STR_LITERAL”是一个糟糕的名称 (4认同)