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

标签 c++ c

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

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

static const char c_seqence[] = "___----__--_-_";

所以使用 ARRAY_LEN(c_seqence) 返回没有 '\0' 的实际序列长度? 不应产生运行时开销。 显然,由于更好的可读性,类似字符串的表示优先于 char 数组 {'_','_',...} 初始化。

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

最佳答案

Is there some trick to define a constant string literal without a trailing '\0' character?

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

static const char c_seqence[ARRAY_LEN("___----__--_-_")-1] = "___----__--_-_";

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

#define MAKE_STR_LITERAL(n, l) static const char n[ARRAY_LEN(l)-1] = l

你可以这样使用它:

MAKE_STR_LITERAL(c_seqence, "___----__--_-_");

注意:

https://stackoverflow.com/a/4348188/2793118 中所述,此行为在标准的第 6.7.8 节中(引用该答案):

§ 6.7.8p14

An array of character type may be initialized by a character string literal, optionally enclosed in braces. Successive characters of the character string literal (including the terminating null character if there is room or if the array is of unknown size) initialize the elements of the array.

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

关于c++ - 不以 nul 结尾的常量字符串文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29134443/

相关文章:

c++ - cout、cin 对象的定义放在哪里?

python - undefined symbol : _ZN2cv3Mat10deallocateEv

C++ 类 : Object that creates Thread + pointer to the function = Access violation

c - 如何将 gdb 与 LD_PRELOAD 一起使用

c - 动态规划SPOJ问题SCUBADIV

c++ - 找出数组中出现次数最少的数

c++ - Dijkstra 算法中的堆

c - 这些参数在 Linux 中究竟意味着什么?

c - 如何在 Emu8086 中使用 'gcc' 从 .c 运行转换后的 .asm 代码

c++ - CPU 架构的 8 位 FFT?