0

我没有在 C 标准中找到如何处理上述宽字符串中的转义序列的解释。

例如:

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

这些是否以某种方式处理(例如在每个字节前加上 \x00 字节)或存储在内存中的方式与此处声明的方式完全相同?

还有,L前缀是如何按照标准操作的?

编辑:

让我们考虑一下txt2。它将如何存储在内存中?\xA9\x00\x03\x00 还是 \xA9\x03 写的?\x03A9 也是如此。这会被视为一个宽字符还是被视为两个单独的字节,它们将被制成两个宽字符?

编辑2:

标准 说:

反斜杠后面的十六进制数字和十六进制转义序列中的字母 x 被视为整数字符常量的单个字符或宽字符常量的单个宽字符的构造的一部分。如此形成的十六进制整数的数值指定所需字符或宽字符的值。

现在,我们有一个 char 文字:

wchar_t txt = L'\xFE\xFF';

它由 2 个十六进制转义序列组成,因此应将其视为两个宽字符。如果这些是两个宽字符,它们不能放入一个 wchar_t 空间(但它在 MSVC 中编译),在我的情况下,这个序列被视为如下:

wchar_t foo = L'\xFFFE';

这是唯一的十六进制转义序列,因此是唯一的宽字符。

编辑3:

结论:每个八进制/十六进制序列都被视为一个单独的值( wchar_t *txt2 = L"\xA9\x03"; 由 3 个元素组成)。wchar_t txt = L'\xFE\xFF'; 不可移植 - 实现定义的功能,应该使用 wchar_t txt = L'\xFFFE';

4

1 回答 1

2

没有任何处理。L"\x03A9"只是一个wchar_t const[2]由两个元素0x3A9和组成的数组0,同样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

切线:我的这个问题详细阐述了字符串文字和转义序列。

于 2013-04-07T18:36:24.500 回答