Согласно C 2018 6.7.2.1 5 битовое поле может иметь тип _Bool
:
Битовое поле должно иметь тип, который является квалифицированной или неквалифицированной версией _Bool
, signed int
, unsigned int
или некоторого другого типа, определенного реализацией…
Предполагается, что источник включает <stdbool.h>
, bool
равен _Bool
, поэтому определение структуры в порядке.
Обратите внимание, что это:
test_struct my_struct = { 0 };
инициализирует все именованные элементы структуры нулем. Это результат спецификации инициализаторов; он не имеет никакого отношения к тому, упакованы ли битовые поля в один байт или нет.
Будут ли все компиляторы предоставлять ожидаемый результат, т. Е. Использовать один бит для хранения значений bool?
Да, стандарт C требует, чтобы реализации C упаковывали битовые поля, если они помещаются в адресуемую единицу хранения, которую реализация выбирает для использования в битовых полях, в C 6.7.2.1 11:
… Если остается достаточно места, битовое поле, которое следует сразу за другим битовым полем в структуре, должно быть упаковано в смежные биты того же блока…
Таким образом, если у вас есть последовательные однобитовые битовые поля, которые умещаются в байте (которые должны быть не менее восьми битов), и им не предшествуют другие битовые поля, они должны быть упакованы в один байт.