Вопрос

У меня есть целое число по уходу за флагом, у которого есть существующий набор возможных флагов:

#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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top