stdatomic.h
, похоже, содержит atomic_uint_least16_t
и atomic_uint_fast16_t
, которые являются _Atomic
версиями _ 5_ типов uint_least16_t
и uint_fast16_t
, но не содержит atomic_uint16_t
. Почему?
Для получения справочной информации из проекта N1548:
7.18.1.1 Целочисленные типы точной ширины
1 Имя typedef
int
N_t
обозначает целочисленный тип со знаком шириной N, без битов заполнения и представление с дополнением до двух. Таким образом,int8_t
обозначает такой знаковый целочисленный тип шириной ровно 8 бит.2 Имя typedef
uint
N_t
обозначает беззнаковый целочисленный тип с шириной N и без битов заполнения. Таким образом,uint24_t
обозначает такой беззнаковый целочисленный тип шириной ровно 24 бита.3 Эти типы не являются обязательными. Однако, если реализация предоставляет целочисленные типы с шириной 8, 16, 32 или 64 бита, без битов заполнения и (для подписанных типов), которые имеют представление с дополнением до двух, она должна определять соответствующие имена typedef.
7.18.1.2 Целочисленные типы минимальной ширины
1 Имя typedef
int_least
N_t
обозначает знаковый целочисленный тип с шириной не менее N, так что ни один знаковый целочисленный тип с меньшим размером не имеет по крайней мере указанной ширины. Таким образом,int_least32_t
обозначает целочисленный тип со знаком шириной не менее 32 бит.2 Имя typedef
uint_least
N_t
обозначает беззнаковый целочисленный тип с шириной не менее N, так что ни один беззнаковый целочисленный тип с меньшим размером не имеет по крайней мере указанной ширины. Таким образом,uint_least16_t
обозначает беззнаковый целочисленный тип шириной не менее 16 бит.3 Требуются следующие типы:
int_least8_t int_least16_t int_least32_t int_least64_t uint_least8_t uint_least16_t uint_least32_t uint_least64_t
Все остальные типы этой формы не являются обязательными.
(и так далее, чтобы включить типы int_fast
N_t
/ uint_fast
N_t
и т. д.)
В пункте 3 стоит выделить:
Однако, если реализация предоставляет целочисленные типы с шириной 8, 16, 32 или 64 бита, без битов заполнения и (для подписанных типов), которые имеют представление с дополнением до двух, она должна определять соответствующие имена typedef.
Это означает, что если, например, у меня есть тип типа int
или short
, который реализован как 16-битное целое число с дополнительным представлением до двух, тогда реализация должна определить int16_t
.
Типы atomic_
для <stdatomic.h>
также перечислены в N1548] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1548.pdf#page=297) (воспроизведено ниже), но это не требует соответствующего требования что если у реализации есть int16_t
, то есть atomic_int16_t
--- это суть моего вопроса.
7.17.6 Атомарные целые числа и типы адресов
1 Для каждой строки в следующей таблице имя атомарного типа объявлено как соответствующий прямой тип.
Atomic type name Direct type ---------------- ----------- atomic_char _Atomic char atomic_schar _Atomic signed char atomic_uchar _Atomic unsigned char atomic_short _Atomic short atomic_ushort _Atomic unsigned short atomic_int _Atomic int atomic_uint _Atomic unsigned int atomic_long _Atomic long atomic_ulong _Atomic unsigned long atomic_llong _Atomic long long atomic_ullong _Atomic unsigned long long atomic_char16_t _Atomic char16_t atomic_char32_t _Atomic char32_t atomic_wchar_t _Atomic wchar_t atomic_int_least8_t _Atomic int_least8_t atomic_uint_least8_t _Atomic uint_least8_t atomic_int_least16_t _Atomic int_least16_t atomic_uint_least16_t _Atomic uint_least16_t atomic_int_least32_t _Atomic int_least32_t atomic_uint_least32_t _Atomic uint_least32_t atomic_int_least64_t _Atomic int_least64_t atomic_uint_least64_t _Atomic uint_least64_t atomic_int_fast8_t _Atomic int_fast8_t atomic_uint_fast8_t _Atomic uint_fast8_t atomic_int_fast16_t _Atomic int_fast16_t atomic_uint_fast16_t _Atomic uint_fast16_t atomic_int_fast32_t _Atomic int_fast32_t atomic_uint_fast32_t _Atomic uint_fast32_t atomic_int_fast64_t _Atomic int_fast64_t atomic_uint_fast64_t _Atomic uint_fast64_t atomic_intptr_t _Atomic intptr_t atomic_uintptr_t _Atomic uintptr_t atomic_size_t _Atomic size_t atomic_ptrdiff_t _Atomic ptrdiff_t atomic_intmax_t _Atomic intmax_t atomic_uintmax_t _Atomic uintmax_t
2 Семантика операций над этими типами определена в 7.17.7.
3 Тип
atomic_bool
предоставляет атомарное логическое значение.4 Тип
atomic_address
обеспечивает атомарные операции void *. Единица сложения / вычитания - один байт.5 ПРИМЕЧАНИЕ. Представление атомарных целочисленных и адресных типов не обязательно должно иметь такой же размер, как их соответствующие обычные типы. По возможности они должны иметь одинаковый размер, так как это упрощает перенос существующего кода.