如果我编写一个使用其他预处理器常量执行操作的#define,每次宏在运行时出现时都会计算最终值吗?这是否取决于编译器中的优化,或者它是否包含在标准中?
例子:
#define EXTERNAL_CLOCK_FREQUENCY 32768
#define TIMER_1_S EXTERNAL_CLOCK_FREQUENCY
#define TIMER_100_MS TIMERB_1_S / 10
每次我使用 TIMER_100_MS 宏时,运行时会发生32768 / 10操作吗?
我想避免以下情况:
#define EXTERNAL_CLOCK_FREQUENCY 32768
#define TIMER_1_S EXTERNAL_CLOCK_FREQUENCY
#define TIMER_100_MS 3276
概括
编译器需要能够评估常量整数表达式,因为它们对于在编译时计算诸如数组大小之类的东西是必需的。然而,标准只说他们“可以”——而不是“必须”——这样做。因此,只有脑死亡的编译器不会在编译时评估常量整数表达式,但对非常规编译器的汇编输出进行简单检查将验证每种情况。