флаг битсет, избегая столкновений, c
Вопрос
У меня есть целое число по уходу за флагом, у которого есть существующий набор возможных флагов:
#define MAIL_ADDR_FROM 0x0001 /* address field contains the from address */
#define MAIL_ADDR_TO 0x0002 /* address field contains the to address */
#define MAIL_SEEN 0x0004 /* message has been read by the user */
#define MAIL_ATTACH 0x0008 /* message has an attachment */
#define MAIL_IMP_HIGH 0x0010 /* message is of high importance */
#define MAIL_IMP_LOW 0x0020 /* message is of low importance */
#define MAIL_FLAGGED 0x0040 /* message has been flagged */
#define MAIL_REPLIED 0x0080 /* message has been replied to */
#define MAIL_DRAFT 0x0100 /* message is a draft */
#define MAIL_NEW 0x0200 /* message is new */
#define MAIL_DELETED 0x8000 /* message is deleted */
Мне нужно добавить новый:
#define MAIL_SPAM 0x???? /* message is spam */
Есть ли причина, по которой существующий список флага пропускает от 0x0200 до 0x8000? Насколько я понимаю, используемые значения для моего нового флага будут 0x0400, 0x0800 и 0x1000-0x4000. Я не понимаю, как работают эти битсеты?
Решение
Да, вы правы - эти отсутствующие значения флага теоретически используются, если они не зарезервированы для чего -то другого.
Вам нужно проверить с первоначальным автором, если есть какая -то конкретная причина, по которой они были пропущены и пошли прямо к 0x8000
.
Конечно нет внутренний Поведение в битовых полках, которые предотвратят их использование.
Другие советы
Короче говоря, ваше понимание в порядке.
Мы можем только догадываться, почему MAIL_DELETED
является 0x8000
И не, скажем, 0x0400
; Я предполагаю, что самый высокий бит был выбран из -за драматической природы «удаленного» флага.
Самая сложная часть внедрения нового бита в чужой битмаски состоит в том, что вам нужно убедиться, что биты, которые кажутся неиспользованными, на самом деле не используются и что они всегда инициализируются последовательно.
Все зависит от того, кто написал это относительно того, что они имел ввиду по их выбранным битовым позициям. Однако из того, что я вижу, похоже, что они сгруппировали битовые флаги логически в байты.
Для вашего, вы можете сделать обоснование для:
#define MAIL_SPAM 0x0400 /* message is spam */
Так как это похоже на состояние, похожее на новое или черновое, но не удаленное.
Я не знаком с вашим приложением, но теоретически значения 0x400,0x800,0x1000,0x2000 и 0x4000 не определены и идеально подходят для других ваших определений, поэтому вы можете добавить новый определение с этими значениями.
Для меня звучит плохая документация. Я бы поместил mail_flag_unused в последние несколько битва, чтобы было очевидно, что они были доступны. Проверьте, чтобы убедиться, что mail_new не использует более высокие биты для какого -то встроенного значения, но на поверхности у вас, похоже, есть куча битов, доступных по сравнению с 0x0400 через 0x4000.