C和C++中字符串文字的类型是什么?

mis*_*tor 60 c c++ string const

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

那么C++呢?

Mic*_*urr 60

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

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

在转换阶段7中,将值为零的字节或代码附加到由字符串文字或文字产生的每个多字节字符序列.然后使用多字节字符序列初始化静态存储持续时间和长度的数组,该数组足以包含序列.对于字符串文字,数组元素具有类型 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标准选择创建字符串文字非常量类型,因为有(并且是)这么多代码期望能够使用char指向文字的非const限定指针.当const添加限定符时(如果我没有弄错的话是围绕ANSI标准化时间完成的,但是在K&R C已经存在很长时间以积累大量现有代码之后),如果他们指向字符串文字,只能将其分配给char const*没有演员表的类型几乎每个现有的程序都需要改变.不是获得标准接受的好方法......

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

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


Chr*_*oph 10

AC字符串文字具有类型char [n],其中n在所述字符串的末尾等于字符+ 1到帐户的数目为隐含零.

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

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

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