如果我编写一个使用其他预处理器常量执行操作的#define,那么每次宏在运行时出现时是否计算出最终值?这取决于编译器中的优化,还是属于标准?
例:
#define EXTERNAL_CLOCK_FREQUENCY 32768
#define TIMER_1_S EXTERNAL_CLOCK_FREQUENCY
#define TIMER_100_MS TIMERB_1_S / 10
将操作十分之三万二千七百六十八每次都发生在运行时我用的是TIMER_100_MS宏?
我想避免以下情况:
#define EXTERNAL_CLOCK_FREQUENCY 32768
#define TIMER_1_S EXTERNAL_CLOCK_FREQUENCY
#define TIMER_100_MS 3276
发布于 2018-08-07 15:00:21
我不知道有任何标准可以保证它会被优化。预处理器将替换32768/10替换TIMER_100_MS,你可以通过运行gcc -c看到它。要查看编译器是否进一步优化,请运行gcc -S并检查汇编程序。使用gcc 4.1,即使没有任何优化标志,这也会在编译期间减少到常量:
#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
...
发布于 2018-08-07 15:57:44
编译器应优化该表达式。我不认为这是标准所要求的,但我从未见过不会执行该任务的编译器。
但是,你不应该写:
#define TIMER_100_MS TIMERB_1_S / 10
因为这是一个等待发生的错误。你应该总是将涉及表达式的#defines括起来。
#define TIMER_100_MS (TIMERB_1_S / 10)
考虑:
i = 10 * TIMER_100_MS;
第一种情况是32768((10 * TIMERB_1_S)/ 10),第二种情况是32760(10 *(TIMERB_1_S / 10))。这里不是一个关键的区别,但你必须意识到它!
https://stackoverflow.com/questions/-100000519
复制相似问题