Битовые поля в C - выравнивание и инициализация

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

Это распространенный способ объявления битового поля:

typedef enum 
{
   unsigned int x: 1;
   unsigned int y: 1;   
}statusBits1;

Пока все хорошо, потом я увидел:

typedef enum 
{
   unsigned int x = 1 << 0,
   unsigned int y = 1 << 1   
}statusBits2;

В моем обучении я считаю, что это устанавливает значения по умолчанию для любых типов данных statusBits2. Это также устанавливает размер полей x и y в 1 бит, как в statusBits1? Я ищу сочетание того и другого.

заранее спасибо.

РЕДАКТИРОВАТЬ: Спасибо за ответы! Вы заставили меня перечитать то, что я изучал. Я смешивал информацию из разных сообщений о битовых полях и битовых масках!

А именно эти:

Объявление и проверка / сравнение (битовая маска-) перечислений в Objective-C

побитовое индексирование в C?

http://forum.codecall.net/topic/56591-bit-fields-flags-tutorial-with-example/

Я возвращаюсь к C после нескольких лет работы с C # / C ++ и повторного изучения битовой игры.


person iDriveTheLateCar    schedule 06.07.2015    source источник
comment
вы уверены, что определяете enum? где вы видите этот синтаксис? stackoverflow .com / questions / 1102542 /.   -  person Jason Hu    schedule 06.07.2015
comment
Из переполнения стека: отрицательное голосование должно быть зарезервировано для крайних случаев. Оглядываясь назад, я понял, что этого вопроса и моих знаний не хватало. добавьте комментарий и расскажите мне, в чем был недостаток, но голосование против не помогает.   -  person iDriveTheLateCar    schedule 07.07.2015
comment
Если это поможет, в этом случае я согласен, что отрицательные голоса не очень полезны, поскольку они пришли без комментариев, объясняющих, почему. Но с голосованием о закрытии я полностью не согласен. Очевидно, о чем вы спрашивали.   -  person Carey Gregory    schedule 07.07.2015


Ответы (2)


Ваш первый пример не обозначает битовое поле. Это будет struct вместо enum.

В новом C ++ вы можете определять значения по умолчанию для членов структуры:

typedef struct
{
    unsigned int x = 1 << 0; /* Default value 1 << 0 = 1 */
    unsigned int y = 1 << 1; /* Default value 1 << 1 = 2 */
} statusBits2;

Однако это невозможно в стандартном C и более старых стандартах C ++ и не устанавливает ширину поля. Вы также можете установить ширину поля:

typedef struct
{
    unsigned int x : 1;   /* Field width 1 bit, no default */
    unsigned int y : 1;   /* Field width 1 bit, no default */
} statusBits2;

Я не знаю способа определить значения по умолчанию и ширину поля ни в C, ни в C ++.

Позвольте мне объяснить смысл вашего второго примера (как вы его написали, с enum):

Ваш второй код почти обозначает перечисление. Это целочисленный тип, который может содержать одно из обозначенных значений. Например:

typedef enum
{
    fish = 3,
    gorilla = 7,
    rabbit = 9
} animal_t;

- это тип, который может иметь одно из значений 3, 7 и 9, которые вы можете использовать по их именам, например:

animal_t my_animal = fish;

(на самом деле он может содержать и другие целые значения).

И перечисления, и структуры могут помочь сделать ваш код более понятным и описательным, но не путайте их!

Ни один из ваших примеров не является допустимым кодом C или C ++.

person urzeit    schedule 06.07.2015
comment
Спасибо за помощь! Я не знаю, как определить как значения по умолчанию, так и ширину поля ни в C, ни в C ++, я не ответил на мой мучительный вопрос. - person iDriveTheLateCar; 07.07.2015

StatusBits2 вообще не содержит битовых полей. Он содержит два unsigned ints со значениями по умолчанию 1 и 2. Однако он также недействителен C. Битовые поля требуют struct, а не enum.

person Carey Gregory    schedule 06.07.2015
comment
@ это о чем ты? Насколько мне известно, ни один из двух примеров в вопросе OP не является расширением компилятора? Битовые поля являются стандартными в C AFAIK. - person Morten Jensen; 06.07.2015
comment
@Carey Gregory: Битового поля нет вообще, это почти перечисление. - person urzeit; 06.07.2015
comment
@MortenJensen Мне плохо. Пример даже не верный код C. - person this; 06.07.2015
comment
@urzeit Эм, это именно то, что я сказал, поэтому я понятия не имею, что означает ваш комментарий. - person Carey Gregory; 06.07.2015
comment
@CareyGregory: комментарий указывал на ваш ответ до того, как вы его отредактировали. - person urzeit; 07.07.2015
comment
спасибо, что поправили меня. Битовые поля требуют структуры, а не перечисления. заставил меня вернуться к тому, что, как я думал, я знал. - person iDriveTheLateCar; 07.07.2015