这是做什么的?
const wchar_t *s = L"test";
如果wchar_t在我的机器上是两个字节,那么我们为什么要告诉编译器应该以每个元素长的方式处理字符串,即四个字节大小?
答案 0 :(得分:15)
L
表示字符串是wchar_t
个字符的字符串,而不是char
个字符的正常字符串。我不知道你从哪里得到了大约四个字节。
从规范部分 6.4.5字符串文字,第2段:
字符串文字是用双引号括起来的零个或多个多字节字符的序列,如
"xyz"
。 宽字符串文字是相同的,除了前缀为字母L
。
摘自第5段:
对于字符串文字,数组元素的类型为
char
,并使用多字节字符序列的各个字节进行初始化;对于宽字符串文字,数组元素的类型为wchar_t
,并使用与多字节字符对应的宽字符序列进行初始化 序列,由mbstowcs
函数定义,具有实现定义的当前语言环境。
答案 1 :(得分:5)
如有疑问,请参阅标准(§6.4.5,String Literals):
字符串文字是一个 零或多个多字节的序列 用双引号括起来的字符, 与
"xyz"
中一样。 宽字符串文字是 同样的,除了前缀 信L
。
请注意,不表示每个字符都是long
,尽管前缀与long
字面后缀相同。
答案 2 :(得分:5)
L
并不意味着long integer
。这意味着字符串中的每个字符都是宽字符。
如果没有此前缀,您将char
的字符串分配给wchar_t
指针,这将是一个不匹配。
答案 3 :(得分:2)
它表示一串宽字符,类型为wchar_t
。
答案 4 :(得分:2)
如果您不知道L
做了什么,那么为什么要对每个数组元素long
(“四个字节大小”)进行断言? long
的想法来自何处?
L
与long
的关系与“妖精”的关系一样多 - 根本没有关系。 L
前缀表示以下字符串文字由宽字符组成,即每个字符都有wchar_t
类型。
P.S。最后,在指向字符串文字时使用const限定指针总是一个好主意:const wchar_t *s = L"test";
。