如果我编写了一个#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
总结
编译器需要能够计算常量积分表达式,因为它们对于在编译时计算数组大小等内容是必需的。然而,该标准只说他们“可以”——而不是“必须”——这样做。因此,只有脑死亡的编译器不会在编译时计算常量整数表达式,但非常规编译器的汇编输出的简单检查将验证每种情况。
最佳答案
宏只是文本替换,因此在您的示例中,在程序中编写 TIMER_100_MS
是编写 32768/10
的一种奇特方式。
因此,问题是编译器何时计算 32768/10
,这是一个常量整数表达式。我认为该标准在这里不需要任何特定的行为(因为运行时和编译时评估实际上是无法区分的),但是任何半途而废的编译器都会在编译时对其进行评估。
关于c - 常量 C 表达式是在编译时还是在运行时求值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/436300/