Как привести к `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.

Другие вопросы по тегам