Возможно ли, что следующий код гарантированно завершится нормально и успешно?У неназванных бит-полей есть четко определенная семантика?
#include <assert.h>
struct foo_s {
union {
struct {
unsigned a : 10;
unsigned : 6;
};
struct {
unsigned : 10;
unsigned b : 6;
};
struct {
unsigned : 10;
unsigned c : 6;
};
};
};
int main() {
struct foo_s f;
f.a = 0;
f.b = 1;
assert(f.a == 0);
return 0;
}
При ответе на другой question, возможность была поднята, что присвоение именованного битового поля в структуре, которая также содержит безымянного битовое поле может вызвать произвольные данные, которые будут записаны в этих битов. С.11 § 6.7.2.1 ¶ 12 гласит:
Декларация битового поля, без описателя, но только двоеточие и ширина, указует безымянного битовое поле.
Мое прочтение этого состоит в том, что неназванное битовое поле является обычным битовым полем, с той лишь разницей, что значение в этих битах невозможно получить напрямую по имени. Реализована ли возможность экстраполяции с использованием логики «как есть» и назначения произвольных данных в этих битах?
Существует очень много правил, связанных с реализацией, для всего, что связано с битовыми полями. Зачем вам нужен шанс? Почему бы просто не создать единую структуру, не содержащую безымянных битовых полей? Конечно, назначается одна часть союза и чтение из другого (и ссылки на '.a' и' .b' являются ссылками на разные (анонимные) члены объединения. –
Содержимое поля Unanamed bit во время работы непредсказуемы, поэтому ** НЕТ ** существует ** нет гарантированного прекращения нормально и успешно **. –
@JonathanLeffler: Обычные причины использования бит-полей основаны на определении интерфейса более высокого уровня на предмет низкого уровня (например, поля в заголовках протоколов) .Это может быть полезно не только в коде, но и при проверке данных в отладчике. Но я хотел бы отложить эту проблему и сосредоточиться на том, хорошо ли определены семантика. – jxh