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_DELETED0x8000而不是,比如说,0x0400;我的猜测是,由于“已删除”标志的戏剧性性质,选择了最高位。

在其他人的位掩码中引入一个新位最棘手的部分是您需要确保看起来未使用的位实际上是未使用的,并且它们始终被一致地初始化。

于 2011-11-30T16:35:50.910 回答
2

这完全取决于谁写的,他们选择的位位置是什么意思。但是,据我所见,它们似乎将位标志在逻辑上分组为字节。

对于您的,您可以提出以下理由:

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

因为它看起来类似于 New 或 Draft 但不是 Deleted 的状态。

于 2011-11-30T16:35:34.823 回答
2

是的,你是对的——那些缺失的标志值在理论上是可用的,除非它们是为其他东西保留的。

如果有任何具体原因导致他们被跳过并直接进入0x8000.

位域中肯定没有阻止它们使用的内在行为。

于 2011-11-30T16:34:05.563 回答
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 回答