gcc的非空终止字符串编译器选项

更新

原来这只是“c ++不是c布鲁斯”的另一个案例


我想要的是

const char hex[16] = "0123456789ABCDEF"; 

唯一有效的

 char hex[16] = "0123456789ABCDE"; hex[15] = "F"; 

是否有任何编译器选项或我可以做的事情使gc​​c编译器中的字符串不为null终止。 这样我就可以制作一个(n)常数数组

不需要编译器选项,它已经非NUL终止。 标准说只有在NUL适合的情况下才能添加NUL,否则它将是溢出。 它可能只是你的数组中的内存中的下一个字节是\0

§6.7.8p14

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

NUL终止的字符串是语言固有的。 您可以拥有一个字符数组,并逐个设置每个字符:

 char hex [] = {'0', '1', '2', ... 'F'}; 

你是在自问自答。 如果明确给出数组长度,如:

 const char hex[16] = "0123456789ABCDEF"; 

那么它当然不会以空值终止,因为没有为空终止保留的存储空间。 ( hex[16]在对象的边界之外,因此读取或写入它是未定义的行为。如果它恰好读为0,那就是你的UB …)

只有当你隐藏长度时才会这样,如:

 const char hex[] = "0123456789ABCDEF"; 

或者如果您使用字符串文字作为对象而不是初始化程序,它将具有空终止。

顺便说一句,如果您不打算使用它,为什么还要关心是否存在空终止。 你试图从二进制文件中删除字节吗? 🙂

字符串在C中以空值终止。如果要填充非空终止的char数组,可以使用数组初始值设定项。

我相信这个问题有点不清楚:在C中,qoted初始化:

 static const char hex[16] = "0123456789ABCDEF"; 

是合法的。 在C ++中,它不是。 因此,当你从C转向C ++时,它是失败的一部分(幸运的是在编译时)。

有一种强制字符串文字而没有终止\ 0字节的方法会很好。 就像是:

 static const char hex[16] = "0123456789ABCDEF\!0"; 

最后的\!0告诉编译器不要对字符串进行零终止! \! 甚至\!0字符串中的任何其他位置都会保持不变,所以只需输出一个字面值!!0