Intereting Posts
Почему компилятор жалуется, когда я не делаю результат malloc? 2D-массивы и указатели – C Как отключить кнопку «Пуск» (но не панель задач) в Windows 7? C: Оценка выражения в очереди не работает Дублирующие символы с var, определенные в защите заголовка и множественного включения Параметр повторного использования strtol Is “int * ptr = * ((& a) + 1);” где “a” является int , четко определенным Стандартом? Как был написан первый компилятор C? Как использовать «% f» для заполнения двойного значения в строке с правильной точностью Препроцессор C с использованием закрывающей скобки родительского макроса gcc 4.2.1 Проблема связывания: Неопределенные символы для архитектуры x86_64 Шаблон, чтобы избежать повторения повторения «если не удалось» Выделение в функции, непригодное в основном Об общем указателе на char и строгом псевдониме могу ли я объявить глобальную переменную в общей библиотеке?

Действительно ли использовать битовые поля с объединением?

Я использовал бит-поле со структурой вроде этого,

struct { unsigned int is_static: 1; unsigned int is_extern: 1; unsigned int is_auto: 1; } flags; 

Теперь я задавался вопросом, можно ли это сделать с объединением, поэтому я изменил код,

 union { unsigned int is_static: 1; unsigned int is_extern: 1; unsigned int is_auto: 1; } flags; 

Я нашел поле бит с работами объединения, но все те поля в объединении даны одному биту, как я понял из вывода. Теперь я вижу, что ошибочно использовать битовые поля с объединением, но мне кажется, что использование этого, как это, не является оперативно правильным. Итак, каков ответ – правильно ли использовать бит-поле с объединением?

    Вам дают пистолет и пули. Можно ли стрелять себе в ногу с ним? Конечно, нет, но никто не может помешать вам сделать это, если захотите.

    Я имею в виду, что, подобно оружию и пулям, союзные и битовые поля являются инструментами, и у них есть цель, использование и «злоупотребления». Таким образом, использование битполей в союзе, как вы уже писали выше, является абсолютно допустимым C, но бесполезным fragmentом кода. Все поля внутри объединения используют одну и ту же память, поэтому все упоминаемые вами битовые поля являются, по сути, одним и тем же флагом, поскольку они используют одну и ту же память.

    Это действительно, но, как вы узнали, не полезно, как вы это сделали.

    Вы можете сделать что-то подобное, чтобы одновременно сбросить все биты с помощью флагов.

     union { struct { unsigned int is_static: 1; unsigned int is_extern: 1; unsigned int is_auto: 1; }; unsigned int flags; }; 

    Или вы можете сделать что-то вроде этого:

     union { struct { unsigned int is_static: 1; unsigned int is_extern: 1; unsigned int is_auto: 1; }; struct { unsigned int is_ready: 1; unsigned int is_done: 1; unsigned int is_waiting: 1; }; };