【发布时间】:2023-03-25 19:24:02
【问题描述】:
我正在为运行 Cortex-M4 架构(具有单精度浮点但不是双精度)的 ARM 处理器编写一段代码。我遇到的问题是在使用可变参数时,编译器试图将我的浮点数提升为双精度数。有什么办法可以关闭它吗?还是指定不同的促销策略?我查看了 GCC 手册,但找不到任何东西。一个简单的例子是尝试编写自己的 printf...
void myprintf(const char *fmt, ...) {
// .. parse fmt and come across %f
double dv = va_arg(args, double); // Compiles but doesn't link
float fv = va_arg(args, float); // Doesn't compile (warns about promotion)
}
更新:根据要求,我希望使用的调用命令是myprintf("%f", 1.0f);。问题是 Cortex-M4 不支持双精度,所以当 1.0f 提升为双精度时……它不能。因此,使用va_arg(args, double) 将其读回将编译但不会链接,因为与双精度相关的各种__aeabi_ 函数不存在。我想要做的是禁用 GCC 将浮点数提升为双精度数(如果可能的话)。
更新:我有一个当前的解决方法,基本上只接受指向浮点数而不是浮点数的指针。我仍然想禁用促销,因为这不是一个很好的解决方案。
【问题讨论】:
-
请说明你是怎么称呼它的。也许使用正确的浮点数(例如
1.0f而不是1.0)会有所帮助。 -
也许是
floatarg 的包装器以使用复合文字((float){arg})然后传递复合文字的地址? -
如果目标处理器不支持双精度,为什么编译器不知道这一点?
-
不应该只是实现
double作为float的同义词吗? -
我同意“应该”,但事实并非如此。使用当前解决方法更新问题
标签: c gcc variadic-functions