我正在为AVR平台开发,我有一个问题。我不希望浮点库与我的代码链接,但我喜欢模拟值范围为0.0 ... 1.0而不是0 ... 255和0 ... 1023的概念,具体取决于偶数我是使用端口作为输入还是作为输出。
所以我决定将输入/输出函数的参数乘以1023.0和255.0。现在,我的问题是:如果我像这样实施分部:
#define analog_out(port, bit) _analog_out(port, ((uint8_t)((bit) * 255.0)))
将GCC(打开-O3标志)优化编译时浮点乘法(在编译时已知并转换为整数类型)进行整数运算? (我知道当使用带有非常量参数的这些宏时,优化是不可能的;我只是想知道它是否会在其他情况下完成。)
答案 0 :(得分:3)
如果您将位作为数字文字提供,GCC应始终进行常量折叠。 如果你希望编译器强制执行constness,你可以逃避这样的事情:
#define force_const(x) (__builtin_choose_expr(__builtin_constant_p(x), (x), (void)0))
#define analog_out(port, bit) _analog_out(port, force_const((uint8_t)((bit) * 255.0)))
答案 1 :(得分:2)
一般来说,我认为gcc -O2
将在编译时对常量进行所有算术运算
它不会将其转换为整数运算 - 只是一个常数整数。
依赖可能是危险的,特别是如果其他人维护代码。将非常量参数传递给宏导致错误的情况并不好。