Использование логических значений вместо значений BOOL с MAKEWORD / MAKEWPARAM - PullRequest
0 голосов
/ 11 октября 2018
// 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 - это фиксированный массив из 4 элементов типа boolean.

Приведенный выше код работает, но я хотел знать, есть ли какая-то конкретная причина, по которой я не могу упроститькод до:

// 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 голосов
/ 11 октября 2018

MAKEWPARAM(a, b) использует C-броски под капотом, что-то вроде

(unsigned long)(a)

или

(unsigned __int64)(a)

Кастинг bool в unsigned long или unsigned __int64 вполне допустими стандарт C ++ (4.7 / 4, [conv.integral]) гарантирует, что приведение false и true даст 0 и 1:

Если тип источникаbool, значение false преобразуется в ноль, а значение true преобразуется в единицу.

FALSE и TRUE равны #define s для 0 и1.Таким образом, ваше упрощение является действительным и эквивалентно исходному коду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...