簡體   English   中英

沒有#include wchar的GCC C中的前綴L“…”代表什么?

[英]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

  • “ Y”或任何字符,您可以將其轉換為int形式,然后將其轉換為L形式,
  • “ y”是一個字符串常量,您不能將其轉換為整數值

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM