如果没有#including wchar,前缀L“......”代表GCC C是什么?

时间:2010-09-22 17:54:34

标签: c types

也就是说,为什么unsigned short var= L'ÿ'有效,但unsigned short var[]= L"ÿ";没有?

5 个答案:

答案 0 :(得分:11)

L'ÿ'属于wchar_t类型,可以隐式转换为unsigned shortL"ÿ"的类型为wchar_t[2],无法隐式转换为unsigned short[2]

答案 1 :(得分:4)

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之间没有定义这样的转换。

答案 2 :(得分:2)

wchar_t只是typedef到标准整数类型之一。编译器实现者选择这样一种足以容纳所有宽字符的类型。如果你没有包含标题,那么这仍然是正确的,并且'ß'是明确定义的,只是你作为程序员不知道它有什么类型。

您对整数类型的初始化是有效的,因为存在将一个转换为另一个的规则。只有在猜测wchar_t正确对应的整数类型时,才能将宽字符串(即宽字符数组的第一个地址的地址)分配给整数指针。没有自动转换不同类型的指针,除非其中一个是void*

答案 3 :(得分:1)

克里斯已经给出了正确的答案,但我想提一些为什么你可能犯了错误的想法。在Windows上,wchar_t在Unicode的早期被定义为16位的方式,它的目的是成为一个16位字符集。不幸的是,事实证明这是一个错误的决定(这使得C编译器无法以符合C标准的方式支持非BMP Unicode字符),但他们仍坚持使用它。

Unix系统从一开始就使用了32位wchar_t,这当然意味着short *wchar_t *是不兼容的指针类型。

答案 4 :(得分:0)

我记得C

  • 'Y'或者其他什么是char,你可以将它转换为int,然后将其转换为L,
  • “y”是字符串常量,您无法将其转换为整数值