[英]What does the prefix L“…” stand for in GCC C without #including wchar?
也就是说,为什么unsigned short var= L'ÿ'
起作用, unsigned short var[]= L"ÿ";
才不是?
L'ÿ'
是wchar_t
类型,可以隐式转换为unsigned short
。 L"ÿ"
的类型为wchar_t[2]
,不能将其隐式转换为unsigned short[2]
。
L
是宽字符文字和宽字符字符串文字的前缀。 这是语言的一部分,而不是标头。 它也不是特定于GCC的。 它们的用法如下:
wchar_t some_wchar = L'ÿ';
wchar_t *some_wstring = L"ÿ"; // or wchar_t some_wstring[] = L"ÿ";
您可以做unsigned short something = L'ÿ';
因为定义了从wchar_t到short的转换。 在wchar_t *和short之间没有定义这种转换。
wchar_t
只是对标准整数类型之一的typedef
。 编译器实现者选择的类型足以容纳所有宽字符。 如果您不包括标题,那么这仍然是正确的,并且L'ß'定义正确,只是您作为程序员不知道它的类型。
将您初始化为整数类型是可行的,因为存在将一个转换为另一个的规则。 仅当您猜测wchar_t
正确对应的整数类型时,才可以将宽字符串(即,宽字符数组的第一个地址的地址)分配给整数指针。 除非其中之一为void*
,否则不会自动转换不同类型的指针。
克里斯已经给出了正确的答案,但是我想对为什么您可能一开始就犯了错误提出了一些想法。 在Windows上, wchar_t
在Unicode早期被定义为16位,原本是16位字符集。 不幸的是,事实证明这是一个错误的决定(C编译器无法以符合C标准的方式来支持非BMP Unicode字符),但是他们对此一无所知。
Unix系统从一开始就使用32位wchar_t
,这当然意味着short *
和wchar_t *
是不兼容的指针类型。
对于我记得的C
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.