常量字符串文字而不终止nul

时间:2015-03-18 23:15:37

标签: c++ c

是否有一些技巧来定义一个没有尾随'\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特性。

3 个答案:

答案 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,但对于每个从搜索引擎中提出这个问题的人来说可能都不是这样。