如何解释MCOIMAPMessage上的typedef枚举属性

时间:2013-10-25 16:36:28

标签: c typedef mailcore2

我的问题主要是关于如何解释typedef枚举,但这里是背景:

我正在使用MailCore2,我正在尝试弄清楚如何读取我正在获取的单个电子邮件对象的标记。

我获取的每封MCOIMAPMessage *电子邮件都有一个名为“flags”的属性。标志的类型为MCOMessageFlag。当我查找MCOMessageFlag的定义时,我发现它是一个typedef枚举:

typedef enum {
    MCOMessageFlagNone          = 0,
    /** Seen/Read flag.*/
    MCOMessageFlagSeen          = 1 << 0,
    /** Replied/Answered flag.*/
   MCOMessageFlagAnswered      = 1 << 1,
    /** Flagged/Starred flag.*/
    MCOMessageFlagFlagged       = 1 << 2,
    /** Deleted flag.*/
    MCOMessageFlagDeleted       = 1 << 3,
    /** Draft flag.*/
    MCOMessageFlagDraft         = 1 << 4,
    /** $MDNSent flag.*/
    MCOMessageFlagMDNSent       = 1 << 5,
    /** $Forwarded flag.*/
    MCOMessageFlagForwarded     = 1 << 6,
    /** $SubmitPending flag.*/
    MCOMessageFlagSubmitPending = 1 << 7,
    /** $Submitted flag.*/
    MCOMessageFlagSubmitted     = 1 << 8,
} MCOMessageFlag;

因为我不知道typedef枚举是如何工作的 - 特别是这个带有'= 1&lt;&lt; 8'类型的组件,我对如何阅读电子邮件的标志属性有点迷茫。

例如,我有一封电子邮件,在服务器上同时包含MCOMessageFlagSeen和MCOMessageFlagFlagged。我想从email.flags属性中找出所提取的电子邮件是否包含这些标记中的一个,两个或两个(如果可能)。但是,在调试器中,当我为具有上述两种标志的电子邮件打印'email.flags'时,我只返回数字5.我没有看到它与上面的typedef枚举定义有什么关系。

最终,我想根据标志是否存在来设置BOOL值。换句话说,我想做一些事情:

BOOL wasSeen = email.flags == MCOMessageFlagSeen;
BOOL isFlagged = email.flags == MCOMessageFlagFlagged;

当然这不起作用,但这是个主意。任何人都可以建议我如何实现这一目标和/或如何理解typedef枚举?

2 个答案:

答案 0 :(得分:3)

这些标志用作bitmask

这允许在单个数字类型中存储多个开/关标志(让它为unsigned charunsigned int)。基本上,如果设置了一个标志,那么它的相应位也会被设置。

例如:

MCOMessageFlagMDNSent       = 1 << 5

1<<5表示1向左移5位,所以二进制:

00000001 << 5 = 00100000

仅当没有标志与其他标志重叠时才有效,这通常通过以1开头并将其向左移一个标志的不同数量来实现。

然后检查是否设置了标志,检查是否设置了相应的位,例如:

if (flags & MCOMessageFlagMDNSent)
如果按位AND结果与零不同,

结果将为true,只有在相应的位置位时才会发生这种情况。

您可以使用OR轻松设置标记:

flags |= MCOMessageFlagMDNSent;

或使用AND重置它:

flags &= ~MCOMessageFlagMDNSent;

答案 1 :(得分:0)

enum的值表示各个位,因此您需要按位操作来检查标志:

BOOL wasSeen = ( email.flags & MCOMessageFlagSeen ); // check if a bit was set
BTW:你的代码似乎暗示这是C,而不是C ++。标记问题几乎总是错误的,我建议您选择正在使用的语言并删除其他标记。