首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >常数C表达式是在编译时还是在运行时计算的?

常数C表达式是在编译时还是在运行时计算的?
EN

Stack Overflow用户
提问于 2018-08-07 06:06:47
回答 2查看 0关注 0票数 0

如果我编写一个使用其他预处理器常量执行操作的#define,那么每次宏在运行时出现时是否计算出最终值?这取决于编译器中的优化,还是属于标准?

例:

代码语言:javascript
复制
#define EXTERNAL_CLOCK_FREQUENCY    32768
#define TIMER_1_S                   EXTERNAL_CLOCK_FREQUENCY
#define TIMER_100_MS                TIMERB_1_S / 10

将操作十分之三万二千七百六十八每次都发生在运行时我用的是TIMER_100_MS宏?

我想避免以下情况:

代码语言:javascript
复制
#define EXTERNAL_CLOCK_FREQUENCY    32768
#define TIMER_1_S                   EXTERNAL_CLOCK_FREQUENCY
#define TIMER_100_MS                3276

EN

回答 2

Stack Overflow用户

发布于 2018-08-07 15:00:21

我不知道有任何标准可以保证它会被优化。预处理器将替换32768/10替换TIMER_100_MS,你可以通过运行gcc -c看到它。要查看编​​译器是否进一步优化,请运行gcc -S并检查汇编程序。使用gcc 4.1,即使没有任何优化标志,这也会在编译期间减少到常量:

代码语言:javascript
复制
#include <stdlib.h>
#include <stdio.h>

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

int main(int argc, char **argv)
{
  printf("%d\n", TIMER_100_MS);

  return(0);
}

gcc -S test.c
cat test.s

...
    popl    %ebx
    movl    $3276, 4(%esp)
    leal    LC0-"L00000000001$pb"(%ebx), %eax
    movl    %eax, (%esp)
    call    L_printf$stub
...
票数 0
EN

Stack Overflow用户

发布于 2018-08-07 15:57:44

编译器应优化该表达式。我不认为这是标准所要求的,但我从未见过不会执行该任务的编译器。

但是,你不应该写:

代码语言:javascript
复制
#define TIMER_100_MS      TIMERB_1_S / 10

因为这是一个等待发生的错误。你应该总是将涉及表达式的#defines括起来。

代码语言:javascript
复制
#define TIMER_100_MS      (TIMERB_1_S / 10)

考虑:

代码语言:javascript
复制
i = 10 * TIMER_100_MS;

第一种情况是32768((10 * TIMERB_1_S)/ 10),第二种情况是32760(10 *(TIMERB_1_S / 10))。这里不是一个关键的区别,但你必须意识到它!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100000519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档