如何转换为 `wint_t` 和 `wchar_t`?
How to cast to `wint_t` and to `wchar_t`?
标准是否保证在以下两个程序中转换为 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_t
是 signed short
的情况(这
假设的实现仅限于 BMP),wint_t
是 signed 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 short
的 wchar_t
,假设 16 位短裤,更改其值。
另一方面,如果用于源代码的字符集是 Unicode,并且编译器已正确配置以正确解析其编码,L'ÿ'
的值 255
为无符号类型,所以第二个例子中的代码是完美定义和明确的。
如果 int
是 32 位宽而 short
是 16 位宽,则将 wchar_t
定义为 int
或 [=22 似乎更加一致=]. WEOF
然后可以定义为 (-1)
,一个不同于 wchar_t
的所有值或至少代表 Unicode 代码点的所有值的值。
标准是否保证在以下两个程序中转换为 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_t
是 signed short
的情况(这
假设的实现仅限于 BMP),wint_t
是 signed 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 short
的 wchar_t
,假设 16 位短裤,更改其值。
另一方面,如果用于源代码的字符集是 Unicode,并且编译器已正确配置以正确解析其编码,L'ÿ'
的值 255
为无符号类型,所以第二个例子中的代码是完美定义和明确的。
如果 int
是 32 位宽而 short
是 16 位宽,则将 wchar_t
定义为 int
或 [=22 似乎更加一致=]. WEOF
然后可以定义为 (-1)
,一个不同于 wchar_t
的所有值或至少代表 Unicode 代码点的所有值的值。