Битовые поля типа кроме интервала?

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

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. Отличаются от международного бита-fileds типа, который они позволили спецификацией языка C C99?
10
задан Sisir 30 September 2019 в 19:54
поделиться

2 ответа

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

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

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

Из проекта C99:

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

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

4
ответ дан 4 December 2019 в 03:16
поделиться

С главной страницы:

Отправка почты

Для отправки сообщения одному или нескольким пользователям можно вызвать почтовую рассылку с помощью аргументы, которые являются именами люди, которым будет отправлена почта. Ожидается, что пользователь введет его сообщение, последовало "control-D" в начале строки.

Другими словами, mailx считывает содержимое для отправки из стандартного ввода и может быть перенаправлен в обычный режим. Например:

ls -l $HOME | mailx -s "The content of my home directory" someone@email.adr
-121--796045-

просто сделайте это и проигнорируйте любую ошибку (предполагает уникальное ограничение для значения)...

BEGIN TRY
    INSERT INTO Table (value) VALUES (@value);
END TRY
BEGIN CATCH
    PRINT 'it was already in there!'
END CATCH

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

(SELECT * FROM Table WITH (UPDLOCK, HOLDLOCK)  WHERE value = @value);

, однако, моя предложенная идея просто ВСТАВИТЬ и игнорировать любую повторяющуюся ошибку ограничения также позволит избежать условия гонки.

-121--3653356-

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

2
ответ дан 4 December 2019 в 03:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: