【发布时间】:2016-09-24 23:16:33
【问题描述】:
我在 16 位目标平台上使用 avr-gcc
我想做这样的事情:
#define F_CPU 16000000
#define MIN_UPDATES_PER_REV 100
#define MAX_RPM 10000
#define UPDATE_PERIOD_cy ( F_CPU*60 / (MIN_UPDATES_PER_REV*MAX_RPM) )
正如预期的那样,我收到一个溢出错误,因为 MIN_UPDATES_PER_REV*MAX_RPM 的计算结果为 0xf4240:
bldc.h:9:40: warning: integer overflow in expression [-Woverflow]
#define UPDATE_PERIOD_cy ( F_CPU*60 / (MIN_UPDATES_PER_REV*MAX_RPM) )
^
如果我将常量强制为 32 位并在折叠后转换回 uint16_t,事情就会解决,尽管我失去了 -Woverflow 的好处:
#define UPDATE_PERIOD_cy (uint16_t)( (uint32_t)F_CPU*60 / ((uint32_t)MIN_UPDATES_PER_REV*MAX_RPM) ))
我可以强制 gcc 在常量折叠期间处理较大的中间值吗?
我可以强制预处理器为我做持续折叠吗?
是否有我应该了解的最佳实践?
【问题讨论】:
-
你知道这个编译器是谁提供的吗?您是否尝试过向他们寻求解决方案?
-
编译器运行正常。我希望找到一种方法让它以不正确但稍微方便的方式运行。
标签: gcc c-preprocessor avr avr-gcc constantfolding