Вы можете сделать это, используя директивы предварительной обработки:
#if Condition1_SUPPORT
#define Const1 (1 << 6)
// ...
#elif Condition2_SUPPORT
#define Const1 (1 << 5)
// ...
#endif
Чтобы отредактировать вопрос: вы не можете переопределить макрос на основе его предыдущего значения. Макрос может иметь только одно значение за раз, и его список замены оценивается только тогда, когда он вызывается, а не когда он определен. Например, это невозможно:
#define A 10
#define A A + 10
Во-первых, это недопустимое переопределение макроса: когда обрабатывается вторая строка, A
уже определен как макрос, и поэтому его нельзя переопределить с помощью другой замены (вам нужно #undef
макрос имя).
Во-вторых, если бы эта лицензия была (и многие компиляторы ее принимают), вторая строка при вызове будет иметь значение A + 10
, а не 10 + 10
или 20
, как вы хотите: ко времени определения второго макроса может быть вызвано, первое определение больше не существует.
Однако вы можете использовать разные имена, например:
#define INITIAL_A 10
#define A INITIAL_A + 10
Вам следует подумать о том, чтобы получить одну из вводных книг от Руководство и список книг Definitive C ; любой из них будет подробно описывать то, что может быть достигнуто с помощью директив предварительной обработки.