Если я пишу #define, который выполняет операцию с использованием других констант препроцессора, это конечное значение, вычисленное каждый раз, когда макрос появляется во время выполнения? Это зависит от оптимизации в компиляторе или покрывается стандартом?
Пример:
#define EXTERNAL_CLOCK_FREQUENCY 32768
#define TIMER_1_S EXTERNAL_CLOCK_FREQUENCY
#define TIMER_100_MS TIMERB_1_S / 10
Будет ли операция 32768/10 выполняться во время выполнения каждый раз, когда я использую макрос TIMER_100_MS?
Я хотел бы избежать следующего:
#define EXTERNAL_CLOCK_FREQUENCY 32768
#define TIMER_1_S EXTERNAL_CLOCK_FREQUENCY
#define TIMER_100_MS 3276
Резюме
Компилятор должен иметь возможность оценивать постоянные интегральные выражения, потому что они необходимы для вычисления таких вещей, как размеры массива во время компиляции. Однако стандарт только говорит, что они "могут" - не "должны" - делать это. Поэтому только компилятор с мозгом не будет оценивать постоянные интегральные выражения во время компиляции, но простая проверка сборки для нетрадиционного компилятора проверит каждый случай.