2

标准是否说在以下两个程序中的转换wint_t和转换wchar_t是正确的?

#include <locale.h>
#include <wchar.h>
int main(void)
{
  setlocale(LC_CTYPE, "");
  wint_t wc;
  wc = getwchar();
  putwchar((wchar_t) wc);
}

--

#include <locale.h>
#include <wchar.h>
#include <wctype.h>
int main(void)
{
  setlocale(LC_CTYPE, "");
  wchar_t wc;
  wc = L'ÿ';
  if (iswlower((wint_t) wc)) return 0;
  return 1;
}

考虑wchar_tis signed short(这个假设的实现仅限于 BMP)、wint_tissigned int和的情况WEOF == ((wint_t)-1)。则(wint_t)U+FFFF与 无异WEOF。是的,U+FFFF是一个保留的代码点,但它碰撞仍然是错误的。

如果没有对现有实现进行详尽的审计,我不想发誓这在现实生活中永远不会发生。

另请参见wchar_t 是否可以提升为 wint_t?

4

1 回答 1

1

在您描述的环境中,wchar_t无法准确描述 BMP:L'\uFEFF'超出范围,wchar_t因为它的类型是无符号等价于wchar_t. (C11 6.4.4.4 字符常量 p9)。将其存储为wchar_t定义为signed short,假设 16 位短路,会更改其值。

另一方面,如果用于源代码的字符集是 Unicode 并且编译器被正确配置以正确解析其编码,L'ÿ'则具有无符号类型的值255,因此第二个示例中的代码是完美定义且明确的。

如果int是 32 位宽和short16 位宽,定义wchar_tintor 或unsigned short. WEOF然后可以定义为(-1),一个不同于所有值wchar_t或至少所有表示 Unicode 代码点的值的值。

于 2016-11-23T08:36:33.020 回答