是否有一些技巧来定义一个没有尾随'\0'
字符的常量字符串文字?
#define ARRAY_LEN(array) (sizeof(array)/sizeof((array)[0]))
static const char c_seqence[] = "___----__--_-_";
那么使用ARRAY_LEN(c_seqence)
返回实际的序列长度而没有'\0'
?
不应生成运行时的ovearhead。
由于更好的可读性,类似字符串表示的字符串初始化为char数组{'_','_',...}
。
C解决方案是优先考虑的,但也可能是一些c ++解决方案可能很有趣,只要它们不依赖于c ++ 11特性。
答案 0 :(得分:4)
有没有一些技巧来定义一个没有的常量字符串文字 尾随'\ 0'字符?
在C中,如果将字符数组的大小指定为小于字符串文字初始值设定项的大小,则它将不具有尾随空字符。你可以这样做:
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
字符类型数组可以由字符串初始化 文字,可选择括在括号中。连续的人物 字符串文字(包括终止空字符if) 有空间或者如果数组的大小未知)初始化 数组的元素。
Note2 :原来这是一个只有C的东西。在C ++中它不会编译。另一个很好的例子,说明为什么人们不应该用C和C ++标记问题。
答案 1 :(得分:2)
最简单的解决方案是更改数组长度宏以忽略尾随空值:
#define ARRAY_LEN(array) (sizeof(array)/sizeof((array)[0]) - 1)
(在胁迫下张贴)
答案 2 :(得分:0)
在C ++ 11中,没有宏:
template <typename T, size_t n>
constexpr size_t array_length(const T (&)[n]) {
return n;
}
template <typename T, size_t n>
constexpr size_t string_length(const T (&)[n]) {
return n - 1;
}
我意识到这个问题明确地消除了C ++ 11,但对于每个从搜索引擎中提出这个问题的人来说可能都不是这样。