标准是否保证在以下两个程序中投射到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
是保留的代码点,但是
碰撞它仍然是错误的。
我不想发誓这在现实生活中永远不会发生 对现有实施的详尽审计。
答案 0 :(得分:1)
在您描述的环境中,wchar_t
无法准确描述BMP:L'\uFEFF'
超出wchar_t
的范围,因为其类型是无符号,等同于{ {1}}。 (C11 6.4.4.4字符常数p9 )。将其存储到定义为wchar_t
的{{1}},假定为16位短路,则会更改其值。
另一方面,如果用于源代码的字符集是Unicode并且编译器已正确配置为正确解析其编码,则wchar_t
具有带有无符号类型的值signed short
,因此第二个例子中的代码是完美定义和明确的。
如果L'ÿ'
为32位宽且255
为16位宽,则将int
定义为short
或wchar_t
似乎更加一致。然后可以将int
定义为unsigned short
,该值不同于WEOF
的所有值或至少代表Unicode代码点的所有值。