在MAKEWORD / MAKEWPARAM中使用布尔值而不是BOOL值

时间:2018-10-10 21:53:43

标签: c++ winapi

// Rebuild the "Assign Flags"
m_dwStudentAssignFlags = MAKEWPARAM(
    MAKEWORD(bIncluded[INDEX(StudentAssign::kItem1)] ? TRUE : FALSE, bIncluded[INDEX(StudentAssign::kItem2)] ? TRUE : FALSE),
    MAKEWORD(bIncluded[INDEX(StudentAssign::kItem3)] ? TRUE : FALSE, bIncluded[INDEX(StudentAssign::kItem4)] ? TRUE : FALSE));

bIncluded是类型为boolean的4个元素的固定数组。

上面的代码有效,但是我想知道是否有任何特定原因导致我无法将代码简化为:

// Rebuild the "Assign Flags"
m_dwStudentAssignFlags = MAKEWPARAM(
    MAKEWORD(bIncluded[INDEX(StudentAssign::kItem1)], bIncluded[INDEX(StudentAssign::kItem2)]),
    MAKEWORD(bIncluded[INDEX(StudentAssign::kItem3)], bIncluded[INDEX(StudentAssign::kItem4)]));

1 个答案:

答案 0 :(得分:4)

MAKEWPARAM(a, b)在幕后使用C-cast,类似

(unsigned long)(a)

(unsigned __int64)(a)

bool投射到unsigned longunsigned __int64是完全有效的,并且C ++标准(4.7 / 4,[conv.integral])可以保证投射false和{ {1}}将产生true0

  

如果源类型为1,则值bool将转换为零,并且   值false将转换为1。

trueFALSETRUE#define的{​​{1}}个。因此,您的简化是有效的,并且等效于原始代码。