题
我有一个旗帜的整数,它具有现有的一组可能的标志:
#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不会使用较高的位用于某种嵌入式值,但是从表面上看,您似乎确实有一堆从0x4000到0x0400的位。
不隶属于 StackOverflow