Выражение
control_word == MACRO3 || control_word == MACRO7
расширяется
control_word == MACRO1 | MACRO2 || control_word == MACRO4 | MACRO3
, который в конечном счете расширяется до
control_word == 1 | 2 || control_word == 4 | 1 | 2
глядя на precedence table, вы видите, что оператор ==
имеет более высокую precendence чем |
, который выше ||
, поэтому оценка:
((control_word == 1) | 2) || ((control_word == 4) | 1 | 2)
, которая вычисляется в
((6 == 1) | 2) || ((6 == 4) | 1 | 2)
, который (6==1
является false
, которая рассматривается как 0 в арифметическом выражении - то же самое для 6==4
)
((0 | 2) || (0 | 1 | 2)
, который является
2 || 3
который
true
как 2 и 3 рассматриваются как true
(не равно нулю), так что вы вводите if
блок, а не else
Чтобы сохранить (предполагаемую) намерения (и получите результат, который вы исправили) вам нужно защитить расширение макросов, обернув их определение в круглых скобках - обратите внимание, что это всегда - хорошая идея, чтобы избежать диссонанса между тем, что вы думаете и что на самом деле происходит.
Это не вопрос макросов. Вы можете просто выполнить все подстановки, и вы поймете, почему вы получаете этот результат. –