char16_t
и char32_t
указаны в стандарте C. (Ниже приведены цитаты из стандарта 2018 года.)
В соответствии с пунктом 7.28, заголовок <uchar.h>
объявляет их как целочисленные типы без знака, которые будут использоваться для 16-битных и 32-битных символов соответственно. Вы не должны охотиться за ними в любом другом заголовке; #include <uchar.h>
должно хватить.
Также в соответствии с пунктом 7.28 каждый из этих типов является самым узким целочисленным типом без знака с требуемым количеством битов. (Например, в реализации, которая поддерживает только целые числа без знака 8, 18, 24 и 36 и 50 бит, uchar16_t
должен быть размером 18 бит; он не может быть 24, а uchar32_t
будет должно быть 36.)
Согласно пункту 6.4.5, когда строковый литерал имеет префикс u
или U
, как в u"abc"
или U"abc"
, это широкий строковый литерал, в котором элементы имеют тип char16_t
или char32_t
соответственно.
В соответствии с пунктом 6.10.8.2, если реализация C определяет макрос препроцессора __STDC_UTF_16__
как 1
, это указывает, что значения char16_t
кодируются в кодировке UTF-16. Точно так же, __STDC_UTF_32__
указывает, что char32_t
значения имеют кодировку UTF-32. В отсутствие этих макросов не делается никаких утверждений о кодировках.