質問
既存の一連のフラグを備えたフラグ保持整数があります。
#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から0x0400から利用できるビットがたくさんあるように見えます。