Битовые поля типа отличного от int? - PullRequest
9 голосов
/ 17 февраля 2010

У меня есть код, который использует битовые поля, объявленные следующим образом

typedef struct my{
    const char *name;
    uint8_t is_alpha : 1;   
    uint8_t is_hwaccel : 1; 
    uint8_t x_chroma_shift; 
    uint8_t y_chroma_shift; 

} mystr; 

uint8_t определено как unsigned char.

Создание кода в MS-VS 2008 с использованием этих битовых полей выдает предупреждение, как показано ниже:

imgconvert.c(60) : warning C4214: nonstandard extension used : bit-field types other than int.
  1. Есть ли проблемы / потенциальные проблемы при использовании битовых полей типа, отличного от int? Почему предупреждение?
  2. Допускаются ли другие значения, кроме битовых файлов типа int, согласно спецификации языка C99 C?

Ответы [ 2 ]

4 голосов
/ 17 февраля 2010

1] Есть ли проблемы / потенциальные проблемы при использовании битовых полей типа, отличного от int? Почему предупреждение?

Поскольку битовые поля являются низкоуровневыми, могут возникнуть проблемы с переносимостью, если вы используете нестандартные типы. Отсюда предупреждение - обратите внимание, что это все же предупреждение, а не ошибка.

2] Отличаются ли они от битовых файлов типа int, которые они разрешены спецификацией языка C99 C?

Из проекта С99:

6.7.2.1 Спецификаторы структуры и объединения

4 Битовое поле должно иметь тип, который квалифицированная или неквалифицированная версия _Bool, подписанный int, unsigned int или какой-либо другой определенный реализацией тип.

2 голосов
/ 17 февраля 2010

Почему бы не использовать int? Реальная реализация битовых полей варьируется от компилятора к компилятору. Если вы хотите написать переносимый код, используйте int. Если вы хотите создать небольшую структуру, или структуру с фиксированным числом байтов, или структуру, в которой биты находятся в фиксированной позиции, не используйте битовые поля. Создайте элемент uint8_t с именем что-то вроде flags и определите макросы для использования в качестве битовых масок.

...