Что считается типом символа в C11?
Что на самом деле относится к "типу символов" в C11 - помимо char
, конечно?
Точнее, специальные исключения для типа символа (например, к любому объекту можно получить выражение lvalue типа символа - см. § 6.5/7 в стандарте C11), к которому применяются конкретные типы? Кажется, они относятся к uint8_t
и int8_t
из stdint.h
, но это гарантировано? С другой стороны, gcc не рассматривает char16_t
от uchar.h
как "характерный тип".
Ответы
Ответ 1
Только char
, signed char
и unsigned char
1.
Типы uint8_t
, int8_t
, char16_t
или любой тип в форме intN_t
или charN_t
могут быть или не быть синонимами для типа символа.
1 (Цитируется по: ISO/IEC 9899: 201x 6.2.5 Типы 15)
Три типа char, подписанные char и unsigned char совместно называются типами символов.
Ответ 2
char
, signed char
и unsigned char
- это типы символов в C11. Это то же самое с C89.
Обработка int8_t
(или uint8_t
) в качестве типа символа имеет много проблем.
- Они не являются обязательными.
- Они могут не существовать, если
CHAR_BIT > 8
.
- Определяется для работы, если в реализации используется 2 представления дополнения (что является наиболее распространенным). Но они представляют собой другие представления, а именно 1 дополнение и знаковое значение, определенные/разрешенные стандартом C.
Поскольку они существуют, если они существуют, typedef'ed для существующего типа, вы, вероятно, можете избежать использования int8_t
или uint8_t
в качестве типа символа на практике. Но стандарт ничего не гарантирует и нет причин рассматривать их как таковые, когда у вас есть реальные типы символов.