c - 常量 C 表达式是在编译时还是在运行时求值?

标签 c optimization compiler-construction standards c-preprocessor

如果我编写了一个#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/

相关文章:

c - C中复合文字的问题

mysql - 有没有办法找到Excel中最大的小数位数

c++ - 计算序列可能性的更快方法?

c - 当操作数是 C 中的指针时,编译器如何处理运算符 +

c - 使用管道将整数从 n 个子级发送到父级 (c/unix)

c - 创建另一个共享库时链接一个共享库

mysql - 为什么 MySQL 使用错误的索引?

haskell - 为什么 Template Haskell 在编译期间允许任意 IO 操作?

c++ - 标准库是否需要符合标准?

c - 从 C 数组中排除唯一值