c字符串函数 - C和C++中字符串文字的类型是什么?



c++字符串拼接 (3)

AC字符串文字的类型为char [n] ,其中n等于字符数+ 1,以说明字符串末尾的隐式零。

该数组将被静态分配; 它不是const ,但修改它是未定义的行为。

如果它具有指针类型char *或不完整类型char [] ,则sizeof无法按预期工作。

使字符串文字const是一个C ++习语,而不是任何C标准的一部分。

https://ffff65535.com

C中字符串文字的类型是什么? 是char *还是const char *还是const char * const

那么C ++呢?


在C中,字符串文字的类型是char[] - 根据类型它不是const ,但是修改内容是未定义的行为。 此外,具有相同内容(或足够相同内容)的2个不同字符串文字可能会也可能不会共享相同的数组元素。

从C99标准6.4.5 / 5“字符串文字 - 语义”:

在转换阶段7中,将值0的字节或代码附加到由字符串文字或文字产生的每个多字节字符序列。 然后使用多字节字符序列初始化静态存储持续时间和长度的数组,该数组足以包含序列。 对于字符串文字,数组元素的类型为char ,并使用多字节字符序列的各个字节进行初始化; 对于宽字符串文字,数组元素的类型为wchar_t ,并使用宽字符序列进行初始化...

如果这些数组的元素具有适当的值,则这些数组是否不同是未指定的。 如果程序试图修改此类数组,则行为未定义。

在C ++中,“一个普通的字符串文字具有n const char '的类型'数组'”(来自2.13.4 / 1“字符串文字”)。 但是在C ++标准中有一个特殊情况,它使得指向字符串文字的指针很容易转换为非const限定的指针(4.2 / 2“数组到指针的转换”):

不是宽字符串文字的字符串文字(2.13.4)可以转换为“指向字符的指针”类型的右值; 可以将宽字符串文字转换为“指向wchar_t的指针”类型的右值。

作为旁注 - 因为C / C ++中的数组很容易转换为指针,所以字符串文字通常可以用在指针上下文中,就像C / C ++中的任何数组一样。

额外的编辑:接下来的内容实际上主要是关于C和C ++标准对字符串文字类型的选择的基本原理。 所以请耐心等待(但如果您有更正或其他详细信息,请发表评论):

我认为C标准选择创建字符串文字非常量类型,因为有(并且是)很多代码期望能够使用指向文字的非const限定的char指针。 当const限定符被添加时(如果我没有弄错的话是围绕ANSI标准化时间完成的,但是在K&R C已经存在很长时间以积累大量现有代码之后)如果他们指向字符串文字只能被分配对于char const*类型而言,几乎每个现有的程序都需要更改。 不是获得标准接受的好方法......

我认为对字符串文字是const限定的C ++的更改主要是为了支持允许文字字符串更恰当地匹配带有“ char const* ”参数的重载。 我认为还需要在类型系统中关闭一个感知的洞,但是这个洞在很大程度上是由阵列到指针转换中的特殊情况打开的。

该标准的附录D表明“不推荐使用从字符串文字(4.2)的const到非const限定的隐式转换”,但我认为如此多的代码仍然会破坏编译器实现者或者编译器实现者需要很长时间。标准委员会愿意实际拔掉插头(除非可以设计出其他一些聪明的技术 - 但是那个洞会回来,不是吗?)。


由于各种历史原因,字符串文字在C中始终为char[]类型。

早期(在C90中),声明修改字符串文字会调用未定义的行为。

他们并没有禁止这样的修改,也没有使字符串文字const char[]更有意义。 这是出于旧代码的向后兼容性原因。 如果你修改了字符串文字,一些旧操作系统(最着名的是DOS)没有抗议,所以有很多这样的代码。

即使在最新的C标准中,C今天仍然存在这种缺陷。

C ++从C继承了同样的缺陷,但在后来的C ++标准中,它们最终使字符串文字成为const (在C ++ 03中标记为过时,最后在C ++ 11中修复)。





const