2010-02-17 3 views
7

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

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 является typedef'ed к unsigned char.

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

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

Предупреждение довольно понятно: __nonstandard extension used__; ваш код может иметь проблемы с переносимостью. –

+0

@Mehrad: Использование типа int полезно из аспектов переносимости только в том случае, если все цели/компиляторы имеют одинаковые значения. – goldenmean

+0

Вы пишете о битовых полях здесь, их размер указан в коде. – AProgrammer

ответ

4

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

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

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

Из проекта C99:

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

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

+7

Не является ли «какой-то другой определенный реализацией тип» совершенно бесполезным в стандартном документе? – 2010-02-17 12:34:28

+0

@Neil Butterworth: ATM, у меня просто есть черновик. Однако нужно будет посмотреть на реальность. Но, да, я думаю, вы правы. – dirkgently

+0

@ dirkgently: Использование типа int полезно из аспектов переносимости только в том случае, если все цели/компилятор гарантированно имеют те же самые размеры. Это разумное предположение. Я не знаю, почему я спрашиваю. – goldenmean

1

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

+0

Вы имеете в виду 'unsigned int'. 'uint8_t' является неподписанным,' int' подписан, смешение их не является хорошим. – kennytm

+0

Я лично не использовал битовые поля в коде, но если это 1-битовое битовое поле, имеет ли значение знак? – tomlogic

Смежные вопросы