У меня есть код, который использует битовые поля, объявленные следующим образом
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] Есть ли какие-либо проблемы/потенциальные проблемы при использовании битовых полей типа, отличного от int? Почему предупреждение?
Поскольку битовые поля являются низкоуровневыми, могут возникнуть проблемы с переносимостью, если вы используете нестандартные типы. Отсюда и предупреждение - обратите внимание, что это все же предупреждение, а не ошибка.
2] Разрешены ли спецификацией языка C99 C битовые поля, отличные от типа int?
Из проекта C99:
6.7.2.1 Спецификаторы структуры и объединения
4 Битовое поле должно иметь тип, который является квалифицированной или неквалифицированной версией _Bool, signed int, unsigned int, или некоторый другой определенный реализацией тип.
С главной страницы:
Отправка почты
Для отправки сообщения одному или нескольким пользователям можно вызвать почтовую рассылку с помощью аргументы, которые являются именами люди, которым будет отправлена почта. Ожидается, что пользователь введет его сообщение, последовало "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
, называемый чем-то вроде флагов
, и определите макросы для использования в качестве битовых масок.