2

可能なフラグの既存のセットを持つフラグ保持整数があります:

#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になります。これらのビットセットがどのように機能するかについて、私は何かを誤解していますか?

4

5 に答える 5

3

一言で言えば、あなたの理解は大丈夫です。

MAIL_DELETED理由は推測できますが、そう0x8000ではありません0x0400。私の推測では、「削除済み」フラグの劇的な性質のために、最高のビットが選択されたと思います。

他の人のビットマスクに新しいビットを導入する際の最も難しい部分は、未使用に見えるビットが実際に未使用であり、常に一貫して初期化されていることを確認する必要があることです。

于 2011-11-30T16:35:50.910 に答える
2

はい、その通りです。これらの欠落しているフラグ値は、他の何かのために予約されていない限り、理論的には使用可能です。

スキップされてに直進した特別な理由があるかどうか、元の作成者に確認する必要があり0x8000ます。

ビットフィールドには、それらの使用を妨げるような固有の動作は確かにありません。

于 2011-11-30T16:34:05.563 に答える
2

それはすべて、選択したビット位置が何を意味するかについて、誰がそれを書いたかによって異なります。しかし、私が見ることができることから、彼らはビットフラグを論理的にバイトにグループ化したように見えます。

あなたのために、あなたは次のことを主張することができます:

#define MAIL_SPAM        0x0400 /* message is spam */

NewまたはDraftに似ているが、Deletedではない状態のように見えるため。

于 2011-11-30T16:35:34.823 に答える
0

私はあなたのアプリケーションに精通していませんが、理論的には、値0x400、0x800、0x1000、0x2000および0x4000は定義されておらず、他の定義に完全に適合しているため、これらの値で新しい定義を追加できます。

于 2011-11-30T16:36:20.090 に答える
0

私には貧弱なドキュメントのように聞こえます。MAIL_FLAG_UNUSEDを最後の数ビットスロットに配置して、それらが使用可能であることを明確にしました。MAIL_NEWが何らかの埋め込み値に上位ビットを使用していないことを確認してください。ただし、表面的には、0x0400から0x4000までのビットの束が使用可能であるように見えます。

于 2011-11-30T16:37:07.023 に答える