- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的问题主要是关于如何解释 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 << 8' 类型组件的枚举,我对如何读取电子邮件的标志属性有点迷茫。
例如,我有一封电子邮件在服务器上同时具有 MCOMessageFlagSeen 和 MCOMessageFlagFlagged。我想从 email.flags 属性中找出所获取的电子邮件是否具有这些标志中的一个、两个或都没有(如果可能)。但是,在调试器中,当我为具有上述两个标志的电子邮件打印“email.flags”时,我只返回数字 5。我看不出它与上面的 typedef 枚举定义有何关系。
最终,我想根据标志是否存在来设置一个 BOOL 值。换句话说,我想做类似的事情:
BOOL wasSeen = email.flags == MCOMessageFlagSeen;
BOOL isFlagged = email.flags == MCOMessageFlagFlagged;
当然这样不行,但是就是这个idea。谁能建议我如何完成这个和/或如何理解 typedef 枚举?
最佳答案
这些标志在 bitmask 中使用.
这允许在单个数字类型中存储多个开/关标志(让它是 unsigned char
或 unsigned int
)。基本上,如果设置了一个标志,那么其对应的位也会被设置。
例如:
MCOMessageFlagMDNSent = 1 << 5
1<<5
表示 1 向左移动 5 位,因此在二进制中:
00000001 << 5 = 00100000
这仅在没有标志与其他标志重叠时有效,这通常通过从 1 开始并将其向左移动每个标志的不同量来实现。
然后检查是否设置了标志,你检查是否设置了相应的位,例如:
if (flags & MCOMessageFlagMDNSent)
结果将是 true
如果按位与结果不为零,则只有在设置相应位时才会发生这种情况。
您可以使用 OR 轻松设置标志:
flags |= MCOMessageFlagMDNSent;
或者用 AND 重置它:
flags &= ~MCOMessageFlagMDNSent;
关于c - 如何解释 MCOIMAPMessage 上的 typedef 枚举属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19595158/
我的问题主要是关于如何解释 typedef 枚举,但这里是背景: 我正在使用 MailCore2,我正在尝试找出如何从我正在获取的单个电子邮件对象中读取标志。 我获取的每个 MCOIMAPMessag
我是一名优秀的程序员,十分优秀!