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