sizeof (bitfield_type), допустимый в ANSI C? - PullRequest
4 голосов
/ 17 сентября 2008
struct foo { unsigned x:1; } f;
printf("%d\n", (int)sizeof(f.x = 1));

Каков ожидаемый результат и почему? Взятие размера битового поля напрямую не допускается. Но, используя оператор присваивания, кажется, что мы все еще можем взять размер типа битового поля.

Что такое "размер битового поля в байтах"? Это размер блока хранения, содержащего битовое поле? Это число бит, занятое bf, округленное до ближайшего числа байтов?

Или конструкция не определена, поскольку в стандарте нет ничего, что отвечало бы на поставленные выше вопросы? Несколько компиляторов на одной платформе дают мне противоречивые результаты.

Ответы [ 13 ]

0 голосов
/ 17 сентября 2008

Нет, вы должны думать об операторе ==, который выдает «логическое» выражение типа int в C и действительно bool в C ++.

Я думаю, что выражение преобразует значение 1 в соответствующий тип битового поля и назначит его битовому полю. Результат также должен быть типом битового поля, потому что я не вижу скрытых повышений или конверсий.

Таким образом, мы эффективно получаем доступ к типу битового поля.

Диагностика компилятора не требуется, поскольку "f.x = 1" не является lvalue, т. Е. Оно не обозначает битовое поле напрямую. Это просто значение типа "unsigned: 1".

Я специально использую «f.x = 1», потому что «sizeof f.x» принимает размер битового поля lvalue, что явно недопустимо.

0 голосов
/ 17 сентября 2008
sizeof( f.x = 1)

возвращает 1 в качестве ответа. Предполагается, что sizeof (1) - это размер целого числа на платформе, на которой вы компилируете, вероятно, 4 или 8 байтов.

0 голосов
/ 17 сентября 2008

Не был бы

(f.x = 1)

будет выражением, оценивающим значение true (технически оно оценивает результат присваивания, который в данном случае равен 1 / true), и, таким образом,

sizeof( f.x = 1)

запрашивает размер true с точки зрения того, сколько символов потребуется для его хранения?

Я должен также добавить, что статья в Википедии о sizeof хороша. В частности, они говорят, что «sizeof - это оператор времени компиляции, который возвращает размер, кратный размеру char, переменной или спецификатора типа в скобках, который ему предшествует».

В статье также объясняется, что sizeof работает с выражениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...