【问题标题】:Any downsides using '?' instead of L'?' with wchar_t?使用“?”有什么缺点吗?而不是 L'?'与 wchar_t?
【发布时间】:2012-07-16 14:52:03
【问题描述】:

使用'?' 风格的字符文字来比较或分配已知类型为wchar_t 的值,而不是使用L'?' 风格的文字有什么缺点吗?

【问题讨论】:

  • 我不这么认为,因为标准说 A char 数组(无论是普通的char,签名的char,还是unsigned char),char16_t 数组,@ 987654329@ 数组或wchar_t 数组可以由窄字符字面量初始化) 但我会检查更多以确保。
  • 仅供参考,对于“便携式”字符,允许'x' != L'x' 的基本原理是允许wchar_t 是Unicode,即使在char 必须是一些EBCDIC 字符集的系统上也是如此。当你考虑一个系统时,无论多么假设,在这种情况下,问题是立即可以回答的:它不可能相同,所以 C(希望 C++ 也是如此)不能要求它们相同,并且您必须使用 L'...' 字符文字来表示 wchar_t
  • @hvd: 哦...所以'x' == L'x'按位相等而不是逻辑相等?
  • 我不完全确定我理解正确。 'x' == L'x' 比较charwchar_t 中的x 字符对应的数值,我认为这也是你的意思?
  • @hvd:啊,是的,这就是我的意思——所以我的理解是,如果x 的表示方式不同,那么它们的数值就会不同,这将让他们不平等...这很有趣,非常感谢您的评论!

标签: c++ c character wchar-t


【解决方案1】:

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

例如,字符 0x80 到 0xff 经常映射到不同的 Unicode 代码点,具体映射取决于编译器的代码页。

显然,Unicode 不可能使用标识转换来映射所有不同的代码页。 如果仅仅扩大就足够了,就不需要像mbtowcs这样的函数了。

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

【讨论】:

  • 大声笑我喜欢你的回答在几分钟内从“是”变成“否”再到“是”。 :)
  • 问题不在于它是否会扩大它们,而是扩大是否总是会产生正确的wchar_t编码
  • 我什至不知道他们是否“编码”本身......尽管他删除了那部分。
  • @BenVoigt '\xAB' 不一定有符号扩展:如果 char 未签名,则不会。 (假设 C++,其中 '\xAB'char。在 C 中,它甚至不是符号扩展,因为 '\xAB'int。)
  • @BenVoigt 不,但我不想编写只有在 char 签名时才有效的代码,所以我不认为 '\xAB' 不会 映射到L'\xAB'
【解决方案2】:

正如我提到的,标准说

字符数组(无论是普通的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

【讨论】:

  • 是的,C 曾经要求 L'?' == '?',然后在某一时刻取消了该要求,并添加了 __STD_MB_MIGHT_NEQ_WC__,以便程序可以知道它们是否仍然可以依赖旧的保证。
  • 我看不到将值限制为基本字符集的问题,Mehrdad 一直在询问 cmets 中的 0xAB。
  • @BenVoigt 抱歉,我不明白。什么价值观?
  • @BenVoigt 那 ('\xAB') 应该是问题,IMO。 '?'在基本字符集中,很明显当wchar_t大于char时,并不是所有的值都能匹配,所以这个答案是对问题的合理解释。
  • @hvd:我很确定问号是占位符。因此使用了“-style”修饰符。
【解决方案3】:

唯一的缺点是您的程序可能会在使用 EBCDIC 的石器时代系统上失败。在任何值得考虑的现实世界系统中,可移植字符集的 charwchar_t 值都是 ASCII,并且在越来越多(但不是全部)上,wchar_t 是 Unicode 代码点编号。

【讨论】:

  • 石器时代的系统?快速搜索得到 BS2000/OSD 9.0,使用 2011 年发布的 EBCDIC。
  • 我想我听说过(虽然只是二手的)银行等仍在使用它们。
  • 有一些大公司仍在使用石器时代的系统(甚至可能是航空业......?),主要是 IBM 大型机,但除非您专门为这些机器编程,否则您可能不会不必关心他们。无论如何,大多数通用代码都不太可能在它们上运行。也不太可能有人在他们身上使用wchar_t...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 2012-06-09
  • 1970-01-01
相关资源
最近更新 更多