5

'?'使用-style 字符文字来比较或分配给已知为 type 的值wchar_t,而不是使用-style 文字是否有任何缺点L'?'

4

3 回答 3

6

他们有错误的数据类型和编码,所以这是个坏主意。编译器将使用标准整数转换(例如符号扩展)默默地扩展字符文字(对于字符串,您会得到类型不匹配的编译错误)。但值可能不匹配。

例如,字符 0x80 到 0xff 经常映射到不同的 Unicode 代码点,而确切的映射因编译器的代码页而异。

显然,Unicode 不可能使用身份转换来映射所有不同的代码页。 如果仅仅扩大就足够了,就不需要像mbtowcs.

WRT 你关于'\xAB'vs的具体问题L'\xAB',它们可能不相等。见http://ideone.com/b1E39

于 2012-07-17T16:20:11.513 回答
3

正如我所提到的,标准说

char 数组(无论是普通charsigned char、 还是unsigned char)、char16_t数组、char32_t数组或wchar_t数组都可以由窄字符字面量初始化...

但是,在__STDC_MB_MIGHT_NEQ_WC__预处理器定义部分中,它说

整数常量 1,旨在表明,在 的编码中wchar_t,基本字符集的成员在用作普通字符文字中的唯一字符时,其代码值不需要等于其值。

对于__STDC_ISO_10646__

yyyymmL 形式的整数常量(例如,199712L)。如果定义了此符号,则 Unicode 所需集中的每个字符在存储在类型对象中时wchar_t,都具有与该字符的短标识符相同的值。

我不完全是解释标准的专业人士,但我认为这意味着您的问题的答案是它们可能有不同的表示,您应该始终使用L.

于 2012-07-17T16:27:03.223 回答
1

The only downside is that your program might fail on stone-age systems using EBCDIC. On any real world system worth consideration, char and wchar_t values for the portable character set are all ASCII, and on increasingly many (but not all), wchar_t is a Unicode codepoint number.

于 2012-07-18T01:17:50.273 回答