gcc docs для cpp объясняют директиву #if
:
[...] и логические операции (& & и ||). Последние два подчиняются обычным законам короткого замыкания стандарта C.
Что это значит? Нет оценки выражений во время предварительной обработки, поэтому как это может быть закорочено?