А я буду держать!!! Меня тоже из-за скобок только сейчас отпустило.
Я как соколиный глаз из того анекдота - на третий день заметил, что
у сарая нет стены: У нас в одном проекте для компиляции разных релизов (разные модели устройства) используется такой механизм:
// Список поддерживаемых фич
#define RELEASE_CAPS_1 0x0001
#define RELEASE_CAPS_2 0x0002
#define RELEASE_CAPS_3 0x0004
...
// Список релизов (моделей устройства)
#define RELEASE_MODEL_1 (RELEASE_CAPS_1 | RELEASE_CAPS_3)
#define RELEASE_MODEL_2 (RELEASE_CAPS_2 | RELEASE_CAPS_3)
#define RELEASE_MODEL_3 (RELEASE_CAPS_3)
#define RELEASE_MODEL_4 RELEASE_CAPS_1 | RELEASE_CAPS_2// !!! А вот здесь один нехороший человек не поставил скобки !!!
...
// Выбор релиза (модели устройства) для компиляции
#define RELEASE_DESTINATION RELEASE_MODEL_4
Затем - везде и повсеместно в проекте используется для проверки поддержки фич такая конструкция:
#if ( RELEASE_DESTINATION & RELEASE_CAPS_1 )
// Код для реализации фичи
#endif
Или так:
int block_sz = 10 + (( RELEASE_DESTINATION & RELEASE_CAPS_1 )? 6:0) + (( RELEASE_DESTINATION & RELEASE_CAPS_2 )? 2:0) ...
И еще бог знает как...
А теперь вопрос на сообразительность (ЗЫ: отредактировал):
Чему будет равно выражение ( RELEASE_DESTINATION & RELEASE_CAPS_3 ) для приведенного выше примера? По замыслу должно быть FALSE(0), а на самом деле TRUE(!=0).
Почему? :-)