Как привести к `wint_t` и`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
является зарезервированной кодовой точкой, но для нее все равно неправильно сталкиваться.
Я не хотел бы поклясться, что это никогда не произойдет в реальной жизни без исчерпывающего аудита существующих реализаций.
Смотрите также Может ли wchar_t быть повышен до wint_t?
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-битный и short
16-битная ширина, кажется гораздо более последовательной для определения wchar_t
как либо int
или же unsigned short
, WEOF
затем может быть определен как (-1)
, значение отличается от всех значений wchar_t
или, по крайней мере, все значения, представляющие кодовые точки Unicode.