【问题标题】:How to Interpret typedef enum property on MCOIMAPMessage如何解释 MCOIMAPMessage 上的 typedef 枚举属性
【发布时间】:2013-11-04 21:15:14
【问题描述】:

我的问题主要是关于如何解释 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

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

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

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

这当然行不通,但这就是想法。谁能建议我如何做到这一点和/或如何理解 typedef 枚举?

【问题讨论】:

    标签: c typedef mailcore2


    【解决方案1】:

    这些标志在bitmask 中使用。

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

    例如:

    MCOMessageFlagMDNSent       = 1 << 5
    

    1&lt;&lt;5 表示 1 左移 5 位,所以二进制:

    00000001 << 5 = 00100000
    

    这仅在没有标志与其他标志重叠时有效,这通常通过从 1 开始并将每个标志向左移动不同的量来实现。

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

    if (flags & MCOMessageFlagMDNSent)
    

    如果按位与结果不为零,则结果将为true,只有在设置相应位时才会发生这种情况。

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

    flags |= MCOMessageFlagMDNSent;
    

    或用 AND 重置它:

    flags &= ~MCOMessageFlagMDNSent;
    

    【讨论】:

    • 谢谢,这很有帮助。
    【解决方案2】:

    enum 的值代表各个位,因此您需要按位运算来检查标志:

    BOOL wasSeen = ( email.flags & MCOMessageFlagSeen ); // check if a bit was set
    

    顺便说一句:您的代码似乎表明这是 C,而不是 C++。标记一个问题几乎总是错误的,我建议您选择您正在使用的语言并删除另一个标记。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-08
      • 2015-01-27
      • 1970-01-01
      • 2013-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多