Но я хочу, чтобы это работало так, как описано выше.
Вы, похоже, имеете в виду, что вы хотите, чтобы препроцессор распознал константы перечисления как таковые и оценивал выражения ==
в этом свете. Боюсь, тебе не повезло.
Препроцессор ничего не знает о перечислениях. Он работает с главным образом необработанным потоком токенов и пробелов. Когда он оценивает директиву, такую как
#if (operation == SUB)
сначала выполняется расширение макроса для получения
#if (ADD == SUB)
. Затем он должен каким-то образом преобразовать токены ADD
и SUB
в числа, но, опять же, он ничего не знает о перечислениях или значении C предыдущего кода. Его правило для интерпретации таких символов как чисел простое: оно заменяет каждый на 0. В результате все три условия препроцессора в вашем коде всегда будут иметь значение true.
Если вы хотите, чтобы препроцессор делал это, вам нужно определить символы для препроцессора. Поскольку вы не используете enum иначе, вы можете просто заменить его на
#define ADD 1
#define SUB 2
#define MUL 3
Если вы также хотите получить enum, просто используйте символы препроцессора, отличные от используемых для констант enum. Вы можете использовать те же или другие значения, которые вам нравятся, потому что никогда не встречаются пары.