2013-04-07 24 views
0

我沒有在C標準中找到解釋如何處理寬字符串中的上述轉義序列。C標準:L前綴和八進制/十六進制轉義序列

例如:

wchar_t *txt1 = L"\x03A9"; 
wchar_t *txt2 = L"\xA9\x03"; 

難道這些不知怎麼處理(如前面添加\ x00的字節每個字節),或者存儲在內存中,正是因爲他們在這裏宣佈的一樣嗎?

另外,L前綴如何按照標準運行?

編輯:

讓我們考慮TXT2。它將如何存儲在內存中? \ xA9 \ x00 \ x03 \ x00或\ xA9 \ x03是否寫入? \ x03A9也一樣。這會被認爲是一個寬字符還是2個獨立的字節,可能會變成兩個寬字符?

EDIT2:

標準說:

後面的反斜線和一個十六進制字母x逃脫 序列中的十六進制數字被認爲是單個字符的建設的一部分的整數 字符常量或寬字符常量的單寬字符。如此形成的十六進制整數的 數值指定所需的 字符或寬字符的值。

現在,我們有一個文字字符:

wchar_t txt = L'\xFE\xFF'; 

它由2個進制轉義序列,因此它應該被視爲兩個寬字符。如果這是兩個寬字符不能放入一個wchar_t的空間(但它編譯的MSVC),並在我的情況下,該序列被視爲如下:

wchar_t foo = L'\xFFFE'; 

這是唯一的十六進制轉義序列,因此唯一的寬字符。

EDIT3:

結論:每個辛/十六進制序列被視爲一個單獨的值(wchar_t的* TXT2 = L 「版權所有\ xA9 \ X03」;由3個要素)。 wchar_t txt = L'\ xFE \ xFF';不可移植 - 實現定義的功能,應該使用wchar_t txt = L'\ xFFFE';

+0

@KerekSB代碼固定 – user206334 2013-04-07 18:45:23

+0

關於您的編輯:誰在乎? 'txt2'按順序指向具有值爲0xA9,0x03和0x00的三個類型爲「wchar_t」的整數數組的第一個元素。該類型的表示取決於您的平臺(並且可以通過將每個整數視爲字節數組來檢查)。 – 2013-04-07 19:24:25

+0

@KerrekSB:問題被標記爲C.字符串文字是隻讀的(在修改它們時有未定義的行爲),但不是'const'。 'char * s =「hello」;'完全合法,但承認是危險的; *應該*是'const',但是編譯器沒有義務提醒它。 – 2013-04-07 19:25:02

回答

2

沒有處理。 L"\x03A9"簡單地是由0x3A90這兩個元素組成的陣列wchar_t const[2],並且類似地L"\xA9\x03"是陣列wchar_t const[3]

注特別C11 6.4.4.4/7:

每個八進制或十六進制轉義序列是能夠 構成轉義序列字符的最長序列。

還有C++ 11 2.14。3/4:

對十六進制序列中的位數沒有限制。

還請注意,當您使用十六進制序列,它是你的責任以確保您的數據類型可以保存值。 C11-6.4.4.4/9實際上將此作爲要求進行拼寫,而在C++中,超出該類型的範圍僅僅是「實現定義的」。 (如果你超出類型的範圍內具有良好的編譯器應該警告你。)


您的代碼是沒有意義的,但是,因爲左手側是沒有使用數組和指針。它應該是這樣的:

wchar_t const * p = L"\x03A9"; // pointer to the first element of a string 

wchar_t arr1[] = L"\x03A9";  // an actual array 
wchar_t arr2[2] = L"\x03A9";  // ditto, but explicitly typed 

std::wstring s = L"\x03A9";  // C++ only 

在切線:此question of mine闡述字符串字面量了一下,轉義序列。

+0

通過「處理」,我認爲OP正在詢問單個寬字符在內存中的表現方式。 – 2013-04-07 18:43:25

+0

@JimBalter:與其他任何整數相同。 – 2013-04-07 18:43:46

+0

恩,*我*知道答案。但關於「確保您的數據類型可以保存該值是您的責任」 - 寬字符串中的字符的數據類型爲「wchar_t」。 – 2013-04-07 18:44:26

相關問題