如何转换为 `wint_t` 和 `wchar_t`?

How to cast to `wint_t` and to `wchar_t`?

标准是否保证在以下两个程序中转换为 wint_twchar_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_tsigned short 的情况(这 假设的实现仅限于 BMP),wint_tsigned int,而 WEOF == ((wint_t)-1)。那么 (wint_t)U+FFFF 就是 与 WEOF 无法区分。是的,U+FFFF 是一个保留代码点,但是 碰撞还是不对的

我不想发誓这在现实生活中永远不会发生 对现有实施的详尽审计。

另见 May wchar_t be promoted to wint_t?

在您描述的环境中,wchar_t无法准确描述BMP:L'\uFEFF'超出了wchar_t的范围,因为它的类型是unsigned[=34] =]相当于wchar_t。 (C11 6.4.4.4 字符常量 p9)。将其存储到定义为 signed shortwchar_t,假设 16 位短裤,更改其值。

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

如果 int 是 32 位宽而 short 是 16 位宽,则将 wchar_t 定义为 int 或 [=22 似乎更加一致=]. WEOF 然后可以定义为 (-1),一个不同于 wchar_t 的所有值或至少代表 Unicode 代码点的所有值的值。