当我将 "%f" 说明符用于snprintf
type 的参数时,我收到 MISRA 类型错误float
。
根据我的研究,MISRA 是正确的,因为 "%f" 需要一种double
.
float
是否存在将使用类型参数而不是 的浮点说明符或修饰符double
?
我正在开发嵌入式系统,不想double
为了取悦snprintf
功能而从 32 位浮点转换为 64 位。代码打印到调试/控制台端口,这是唯一发生转换的地方。
对于那些需要代码示例的人:
// This section is for those C++ purists and it fulfills the C++ tag.
#if __cplusplus
#include <cstdio>
#else
#include <stdio.h>
#endif
#define BUFFER_SIZE (128U)
int main(void)
{
char buffer[BUFFER_SIZE];
float my_float = 1.234F;
// The compiler will promote the single precision "my_float"
// to double precision before passing to snprintf.
(void)snprintf(buffer, BUFFER_SIZE, "%10.4f", my_float);
puts(buffer);
return 0;
}
我对 SO 和 Web 的所有研究都是关于打印一个浮点值,而不是关于哪些说明符需要一个float
参数以便不会double
发生任何提升。
我正在为 ARM7TDMI 处理器使用 IAR Embedded Workbench 编译器。