// 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)]));
答案 0 :(得分:4)
MAKEWPARAM(a, b)
在幕后使用C-cast,类似
(unsigned long)(a)
或
(unsigned __int64)(a)
将bool
投射到unsigned long
或unsigned __int64
是完全有效的,并且C ++标准(4.7 / 4,[conv.integral])可以保证投射false
和{ {1}}将产生true
和0
:
如果源类型为
1
,则值bool
将转换为零,并且 值false
将转换为1。
true
和FALSE
是TRUE
和#define
的{{1}}个。因此,您的简化是有效的,并且等效于原始代码。