As expressões C constantes são avaliadas no tempo de compilação ou no tempo de execução?

Se eu escrever um#definir que executa uma operação usando outras constantes do pré-processador, o valor final é calculado cada vez que a macro aparece no tempo de execução? Isso depende de otimizações no compilador ou é coberto por um padrão?

Exemplo:

#define EXTERNAL_CLOCK_FREQUENCY    32768
#define TIMER_1_S                   EXTERNAL_CLOCK_FREQUENCY
#define TIMER_100_MS                TIMERB_1_S / 10

A operação32768/10 ocorrer em tempo de execução toda vez que eu uso a macro TIMER_100_MS?

Eu gostaria de evitar o seguinte:

#define EXTERNAL_CLOCK_FREQUENCY    32768
#define TIMER_1_S                   EXTERNAL_CLOCK_FREQUENCY
#define TIMER_100_MS                3276
Sumário

Um compilador é necessário para poder avaliar expressões integrais constantes, porque elas são necessárias para calcular itens como tamanhos de matriz em tempo de compilação. No entanto, o padrão diz apenas que eles "podem" - não "devem" - fazê-lo. Portanto, apenas um compilador com morte cerebral não avaliaria expressões constantes constantes no tempo de compilação, mas uma simples verificação da saída do assembly para um compilador não convencional verificaria cada caso.

questionAnswers(9)

yourAnswerToTheQuestion