gcc的非空终止字符串编译器选项
更新
原来这只是“c ++不是c布鲁斯”的另一个案例
我想要的是
const char hex[16] = "0123456789ABCDEF";
唯一有效的
char hex[16] = "0123456789ABCDE"; hex[15] = "F";
是否有任何编译器选项或我可以做的事情使gcc编译器中的字符串不为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
。