【问题标题】:What does the prefix L"..." stand for in GCC C without #including wchar?没有#include wchar的GCC C中前缀L“...”代表什么?
【发布时间】:2010-09-22 17:54:33
【问题描述】:

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

【问题讨论】:

  • 你是说unsigned short some_variable_name = L'ÿ'吗?因为否则,那不是有效的 C。
  • 是的,没错。我只是想知道L是什么意思。谢谢。
  • 来自规范:“字符串文字是用双引号括起来的零个或多个多字节字符的序列,如 "xyz". 宽字符串文字是相同的,除了前缀是字母L。”

标签: c types


【解决方案1】:

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

【讨论】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        克里斯已经给出了正确的答案,但我想就您可能一开始就犯错误的原因提出一些想法。在 Windows 上,wchar_t 早在 Unicode 的早期就被定义为 16 位,它原本是 16 位字符集。不幸的是,这是一个错误的决定(这使得 C 编译器无法以符合 C 标准的方式支持非 BMP Unicode 字符),但他们坚持了下来。

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

        【讨论】:

          【解决方案5】:

          关于我对 C 的记忆

          • 'Y' 或任何字符,您可以将其转换为 int,从而将其转换为 L,
          • “y”是字符串常量,不能转换成整数值

          【讨论】:

          • unsigned short var[] 不是整数值。这是shorts 的数组。 :-P
          猜你喜欢
          • 2012-10-16
          • 1970-01-01
          • 1970-01-01
          • 2011-05-04
          • 1970-01-01
          • 1970-01-01
          • 2020-03-28
          • 1970-01-01
          • 2020-01-22
          相关资源
          最近更新 更多